automated terminal push
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
__pycache__
|
||||
|
||||
Downloads
|
||||
|
||||
2
.trash/README.md
Normal file
2
.trash/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# yankee-fire-control-code
|
||||
|
||||
37
.trash/RestAPIClient (copy 1).py
Normal file
37
.trash/RestAPIClient (copy 1).py
Normal file
@@ -0,0 +1,37 @@
|
||||
import requests
|
||||
|
||||
## https://www.nylas.com/blog/use-python-requests-module-rest-apis/#how-to-use-python-requests
|
||||
|
||||
def callGET(url):
|
||||
|
||||
print("enter -> callGET()")
|
||||
|
||||
print("param / url / ",url)
|
||||
|
||||
params = dict(
|
||||
origin='Chicago,IL',
|
||||
destination='Los+Angeles,CA',
|
||||
waypoints='Joplin,MO|Oklahoma+City,OK',
|
||||
sensor='false',
|
||||
url2=url
|
||||
)
|
||||
|
||||
headers = {'Accept': 'application/json'}
|
||||
|
||||
print("params", params)
|
||||
|
||||
response = requests.post("https://osiris.yankee.valorantdigital.com/channel/monthly/games/success/exists", headers=headers, data=params, params=params)
|
||||
|
||||
print("response2", response.json())
|
||||
|
||||
def callPOST():
|
||||
|
||||
print("enter -> callPOST()")
|
||||
|
||||
response = requests.post('https://httpbin.org/post', data = {'key':'value'})
|
||||
|
||||
print("response", response.json())
|
||||
|
||||
callGET("https://embanet.online")
|
||||
|
||||
#callPOST()
|
||||
42
.trash/jmsclient.py
Normal file
42
.trash/jmsclient.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import stomp
|
||||
import time
|
||||
import veneno
|
||||
import fetcher
|
||||
|
||||
class MyListener(stomp.ConnectionListener):
|
||||
|
||||
def on_message(headers, message):
|
||||
|
||||
conn.ack(headers['message-id'])
|
||||
|
||||
print("** new message! **")
|
||||
|
||||
print(message)
|
||||
|
||||
fetcher.fetch(message.body)
|
||||
|
||||
|
||||
|
||||
def on_error(headers, message):
|
||||
|
||||
print('received an error "%s"' % message)
|
||||
|
||||
conn.ack(headers['message-id'])
|
||||
|
||||
conn = stomp.Connection([('osiris.yankee.valorantdigital.com', 61613)])
|
||||
|
||||
conn.set_listener('', MyListener())
|
||||
|
||||
conn.connect('admin', 'password', wait=True)
|
||||
|
||||
conn.subscribe('/queue/sully-gnome-urls', id=1, ack='client', headers={'activemq.prefetchSize': 10})
|
||||
|
||||
print("## notification > connected to JMS server")
|
||||
|
||||
while True:
|
||||
|
||||
pass
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
conn.disconnect()
|
||||
19
.trash/veneno.py
Normal file
19
.trash/veneno.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# veneno.py
|
||||
|
||||
def fetch(x):
|
||||
|
||||
print(f"launch -> data fetcher -> url -> {x}")
|
||||
|
||||
def eat(x,y):
|
||||
|
||||
"""Consumes x and y (pretend eating!).
|
||||
|
||||
Args:
|
||||
x: The first amount to be consumed.
|
||||
y: The second amount to be consumed.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
|
||||
print(f"Eating {x} and {y}...")
|
||||
69
DiskUtils.py
Normal file
69
DiskUtils.py
Normal file
@@ -0,0 +1,69 @@
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import fnmatch
|
||||
|
||||
def dowork():
|
||||
|
||||
################################################################################################
|
||||
|
||||
url = "https://sullygnome.com/channel/kaicenat/2023january/streams"
|
||||
|
||||
print("checking disk for the stuff...")
|
||||
|
||||
print("url", url)
|
||||
|
||||
fileExists = check_download_exists_matching_url(url)
|
||||
|
||||
print("file already exists / ",fileExists)
|
||||
|
||||
################################################################################################
|
||||
|
||||
def check_download_exists_matching_url(url):
|
||||
|
||||
print ("hello?")
|
||||
|
||||
match = re.search(r"https://sullygnome.com/channel/([^/]+)/(\d+)([a-z]+)/games", url.lower())
|
||||
|
||||
if not match:
|
||||
|
||||
print(f"Invalid URL format. Could not extract channel name, year, or month.")
|
||||
|
||||
return
|
||||
|
||||
channel_name, year, month = match.groups()
|
||||
|
||||
print("channel / ",channel_name)
|
||||
|
||||
print("year / ",year)
|
||||
|
||||
print("month / ",month)
|
||||
|
||||
#file_pattern = f"{channel_name}*{month}*{year}*.csv"
|
||||
|
||||
## this is a problem. it works but if there 2 channels.
|
||||
## redbull and redbull2 this is throw false positives. ugh
|
||||
|
||||
file_pattern = f"*{channel_name} - game stats on Twitch in {month} {year} - SullyGnome.csv".lower()
|
||||
|
||||
for filename in os.listdir("/home/yankee/Downloads/"):
|
||||
|
||||
updated = filename.lower()
|
||||
|
||||
print("file in downloads / ",updated)
|
||||
|
||||
if fnmatch.fnmatch(updated, file_pattern):
|
||||
|
||||
print(f"Found matching file: {updated}")
|
||||
|
||||
return True
|
||||
|
||||
else:
|
||||
|
||||
print(f"No matching CSV file found for channel '{channel_name}' in year '{year}' and month '{month}'.")
|
||||
|
||||
return False
|
||||
|
||||
def shutDownRobot():
|
||||
|
||||
print("shutting down the robot now")
|
||||
146
RestAPIClient.py
Normal file
146
RestAPIClient.py
Normal file
@@ -0,0 +1,146 @@
|
||||
import requests
|
||||
import json
|
||||
import socket
|
||||
|
||||
## https://www.nylas.com/blog/use-python-requests-module-rest-apis/#how-to-use-python-requests
|
||||
## https://www.abstractapi.com/guides/ip-geolocation/get-ip-address-python
|
||||
|
||||
def ip():
|
||||
|
||||
try:
|
||||
|
||||
public_ip = requests.get('https://api.ipify.org').text
|
||||
|
||||
print(f"Public IP Address: {public_ip}")
|
||||
|
||||
return public_ip
|
||||
|
||||
except requests.RequestException as e:
|
||||
|
||||
print(f"Error retrieving public IP address: {e}")
|
||||
|
||||
return None
|
||||
|
||||
def addDownloadSuccess(url):
|
||||
|
||||
print("enter -> addDownloadSuccess()")
|
||||
|
||||
print("param / url / ",url)
|
||||
|
||||
data = {"url": url, "hostIP": ip(),"ip": ip(),}
|
||||
|
||||
json_data = json.dumps(data)
|
||||
|
||||
print("param / data / ",data)
|
||||
|
||||
print("param / data / ",json_data)
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
|
||||
|
||||
|
||||
response = requests.post("https://osiris.yankee.embanet.online/channel/monthly/games/success/add", data=json_data, headers=headers)
|
||||
|
||||
print(response.text)
|
||||
|
||||
|
||||
def addDownloadFailure(url):
|
||||
|
||||
print("enter -> addDownloadFailure()")
|
||||
|
||||
print("param / url / ",url)
|
||||
|
||||
data = {"url": url, "hostIP": ip(),"ip": ip(),}
|
||||
|
||||
json_data = json.dumps(data)
|
||||
|
||||
print("param / data / ",data)
|
||||
|
||||
print("param / data / ",json_data)
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
|
||||
|
||||
|
||||
response = requests.post("https://osiris.yankee.embanet.online/channel/monthly/games/failure/add", data=json_data, headers=headers)
|
||||
|
||||
print(response.text)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#print("params", params)
|
||||
|
||||
#response = requests.post("https://osiris.yankee.embanet.online/channel/monthly/games/success/exists", headers=headers, data=params, params=params)
|
||||
|
||||
#print("response2", response.json())
|
||||
|
||||
|
||||
def searchURLSuccesses(url):
|
||||
|
||||
print("enter -> callGET()")
|
||||
|
||||
print("param / url / ",url)
|
||||
|
||||
params = dict(
|
||||
origin='Chicago,IL',
|
||||
destination='Los+Angeles,CA',
|
||||
waypoints='Joplin,MO|Oklahoma+City,OK',
|
||||
sensor='false',
|
||||
url2=url
|
||||
)
|
||||
|
||||
|
||||
#data = {"name": "Jane Smith", "email": "janesmith@example.com", "url": url }
|
||||
|
||||
data = { "url": url }
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
|
||||
json_data = json.dumps(data)
|
||||
|
||||
response = requests.post("https://osiris.yankee.embanet.online/channel/monthly/games/success/exists", data=json_data, headers=headers)
|
||||
|
||||
print(response.text)
|
||||
|
||||
return response.text
|
||||
|
||||
def searchURLFailures(url):
|
||||
|
||||
print("enter -> callGET()")
|
||||
|
||||
print("param / url / ",url)
|
||||
|
||||
params = dict(
|
||||
origin='Chicago,IL',
|
||||
destination='Los+Angeles,CA',
|
||||
waypoints='Joplin,MO|Oklahoma+City,OK',
|
||||
sensor='false',
|
||||
url2=url
|
||||
)
|
||||
|
||||
|
||||
#data = {"name": "Jane Smith", "email": "janesmith@example.com", "url": url }
|
||||
|
||||
data = { "url": url }
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
|
||||
json_data = json.dumps(data)
|
||||
|
||||
response = requests.post("https://osiris.yankee.embanet.online/channel/monthly/games/failure/exists", data=json_data, headers=headers)
|
||||
|
||||
print(response.text)
|
||||
|
||||
return response.text
|
||||
120
SullyGnomeRobot.py
Normal file
120
SullyGnomeRobot.py
Normal file
@@ -0,0 +1,120 @@
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.chrome.service import Service
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
import time
|
||||
from selenium.webdriver.support.select import Select
|
||||
import RestAPIClient
|
||||
import DiskUtils
|
||||
|
||||
## https://sullygnome.com/channel/kaicenat/365/games"
|
||||
|
||||
def download(url):
|
||||
|
||||
print(f"launch -> SullyGnomeRobot -> download() -> {url}")
|
||||
|
||||
driver = webdriver.Firefox()
|
||||
|
||||
driver.get(url)
|
||||
|
||||
##########################################
|
||||
|
||||
print("stage / start / tblControl_length check")
|
||||
|
||||
try:
|
||||
|
||||
dataset_drop_down_element = WebDriverWait(driver, 5).until(
|
||||
|
||||
EC.presence_of_element_located((By.NAME, "tblControl_length"))
|
||||
|
||||
)
|
||||
|
||||
dataset_drop_down_element = Select(dataset_drop_down_element)
|
||||
|
||||
dataset_drop_down_element.select_by_visible_text("100")
|
||||
|
||||
except Exception as e:
|
||||
|
||||
print(f"Element with class name 'tblControl_length' not found: {e}")
|
||||
|
||||
RestAPIClient.addDownloadFailure(url)
|
||||
|
||||
driver.quit()
|
||||
|
||||
return False
|
||||
|
||||
print("stage / complete / tblControl_length check")
|
||||
|
||||
##########################################
|
||||
|
||||
print("stage / start / TableExportLinkButton check")
|
||||
|
||||
try:
|
||||
|
||||
WebDriverWait(driver, 5).until(
|
||||
EC.presence_of_element_located((By.CLASS_NAME, "TableExportLinkButton"))
|
||||
)
|
||||
|
||||
link = driver.find_element(By.CLASS_NAME, "TableExportLinkButton")
|
||||
|
||||
link.click()
|
||||
|
||||
except Exception as e:
|
||||
|
||||
print(f"Element with class name 'TableExportLinkButton' not found: {e}")
|
||||
|
||||
RestAPIClient.addDownloadFailure(url)
|
||||
|
||||
driver.quit()
|
||||
|
||||
return False
|
||||
|
||||
print("stage / complete / TableExportLinkButton check")
|
||||
|
||||
##########################################
|
||||
|
||||
print("file download started. now checking if exist before closing")
|
||||
|
||||
while True:
|
||||
|
||||
print("checking is file exists... [loop]")
|
||||
|
||||
existsAlready = DiskUtils.check_download_exists_matching_url(url)
|
||||
|
||||
print("file already exists / ",existsAlready)
|
||||
|
||||
if existsAlready:
|
||||
|
||||
print(f"The file matching the url '{url}' exists.")
|
||||
|
||||
print("sleeping for 4 secs before shutting down robot")
|
||||
|
||||
time.sleep(4)
|
||||
|
||||
print("shutting down the robot")
|
||||
|
||||
driver.quit()
|
||||
|
||||
print("robot shut down. breaking. and dying.")
|
||||
|
||||
break
|
||||
|
||||
else:
|
||||
|
||||
print(f"The file matching the url '{url}' DOES NOT exist.")
|
||||
|
||||
print("sleeping for some time before checking again...");
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
print(" file is finished downloading.moving on.")
|
||||
|
||||
##########################################
|
||||
|
||||
RestAPIClient.addDownloadSuccess(url)
|
||||
|
||||
print("stage / complete / database updated w/ success")
|
||||
|
||||
print(f"complete -> SullyGnomeRobot -> download() -> {url}")
|
||||
46
consumer.bash
Normal file
46
consumer.bash
Normal file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
|
||||
##
|
||||
|
||||
set -e
|
||||
|
||||
set -x
|
||||
|
||||
##
|
||||
|
||||
reset
|
||||
|
||||
clear
|
||||
|
||||
##
|
||||
|
||||
codeDir=/home/yankee/Code
|
||||
|
||||
rm -rf $codeDir
|
||||
|
||||
mkdir $codeDir
|
||||
|
||||
ln -s /yankee/code $codeDir
|
||||
|
||||
ls -lha $codeDir
|
||||
|
||||
##
|
||||
|
||||
downloadsDir=/home/yankee/Downloads
|
||||
|
||||
rm -rf /home/yankee/Downloads
|
||||
|
||||
##mkdir $downloadsDir
|
||||
|
||||
ln -s /yankee/downloads/ /home/yankee/Downloads
|
||||
|
||||
ls -lha $downloadsDir
|
||||
|
||||
##
|
||||
|
||||
echo "##"
|
||||
echo "## launch > yankee gnome > consumer.py"
|
||||
echo "##"
|
||||
|
||||
python3 consumer.py
|
||||
|
||||
76
consumer.py
Normal file
76
consumer.py
Normal file
@@ -0,0 +1,76 @@
|
||||
import stomp
|
||||
import time
|
||||
import SullyGnomeRobot
|
||||
import RestAPIClient
|
||||
|
||||
class MyListener(stomp.ConnectionListener):
|
||||
|
||||
def on_message(headers, message):
|
||||
|
||||
print("** new message! **")
|
||||
|
||||
print("message / ", message)
|
||||
|
||||
print("messagebody / ", message.body)
|
||||
|
||||
print("checking the value does or doesnt exist in db")
|
||||
|
||||
alreadyExistsSuccess = RestAPIClient.searchURLSuccesses(message.body)
|
||||
|
||||
print("alreadyExistsSuccess / ", alreadyExistsSuccess)
|
||||
|
||||
if alreadyExistsSuccess.lower().strip() == "true":
|
||||
|
||||
print("this record exists (successes). returning. doing nothing")
|
||||
|
||||
return
|
||||
|
||||
print("didn't exist in success. check in errors now.")
|
||||
|
||||
alreadyExistsFailure = RestAPIClient.searchURLFailures(message.body)
|
||||
|
||||
print("alreadyExistsFailure / ", alreadyExistsFailure)
|
||||
|
||||
if alreadyExistsFailure.lower().strip() == "true":
|
||||
|
||||
print("this record exists (failures). returning. doing nothing")
|
||||
|
||||
return
|
||||
|
||||
print("didn't exist in success or errors. will process now")
|
||||
|
||||
try:
|
||||
|
||||
SullyGnomeRobot.download(message.body)
|
||||
|
||||
except Exception as e:
|
||||
|
||||
print(f"exception / something went wrong when the sully gnome robot was downloading: {e}")
|
||||
|
||||
RestAPIClient.addDownloadFailure(message.body)
|
||||
|
||||
def on_error(headers, message):
|
||||
|
||||
print('received an error "%s"' % message)
|
||||
|
||||
RestAPIClient.addDownloadFailure(message.body)
|
||||
|
||||
conn = stomp.Connection([('osiris.yankee.embanet.online', 61613)])
|
||||
|
||||
conn.set_listener('', MyListener())
|
||||
|
||||
conn.connect('admin', 'password', wait=True)
|
||||
|
||||
conn.subscribe('/queue/yankee-sully-channels-monthly', id=1, ack='auto', headers={'activemq.prefetchSize': 10})
|
||||
|
||||
print("## ")
|
||||
print("## notification > connected to JMS server (yankee-sully-channels-monthly)")
|
||||
print("## ")
|
||||
|
||||
while True:
|
||||
|
||||
pass
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
conn.disconnect()
|
||||
9
downloadcheck/fastdownload.bash
Normal file
9
downloadcheck/fastdownload.bash
Normal file
@@ -0,0 +1,9 @@
|
||||
set -e
|
||||
|
||||
set -x
|
||||
|
||||
reset
|
||||
|
||||
clear
|
||||
|
||||
python3 fastdownload.py
|
||||
89
downloadcheck/fastdownload.py
Normal file
89
downloadcheck/fastdownload.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
|
||||
def dowork():
|
||||
|
||||
################################################################################################
|
||||
|
||||
url = "https://sullygnome.com/channel/kaicenat/2023january/streams"
|
||||
|
||||
print("checking disk for the stuff...")
|
||||
|
||||
print("url", url)
|
||||
|
||||
fileExists = check_download_exists_matching_url(url)
|
||||
|
||||
print("file already exists / ",fileExists)
|
||||
|
||||
################################################################################################
|
||||
|
||||
def check_download_exists_matching_url(url):
|
||||
|
||||
print ("hello?")
|
||||
|
||||
match = re.search(r"https://sullygnome.com/channel/([^/]+)/(\d+)([a-z]+)/streams", url.lower())
|
||||
|
||||
if not match:
|
||||
|
||||
print(f"Invalid URL format. Could not extract channel name, year, or month.")
|
||||
|
||||
return
|
||||
|
||||
channel_name, year, month = match.groups()
|
||||
|
||||
print("channel / ",channel_name)
|
||||
|
||||
print("year / ",year)
|
||||
|
||||
print("month / ",month)
|
||||
|
||||
#file_pattern = f"{channel_name}*{month}*{year}*.csv"
|
||||
|
||||
file_pattern = f"{channel_name} - Twitch stream stats in {month} {year} - SullyGnome.csv".lower()
|
||||
|
||||
for filename in os.listdir("/home/softwareshinobi/Downloads/"):
|
||||
|
||||
updated = filename.lower()
|
||||
|
||||
print("updated / ",updated)
|
||||
|
||||
if re.match(file_pattern, updated):
|
||||
|
||||
print(f"Found matching file: {updated}")
|
||||
|
||||
return True
|
||||
|
||||
else:
|
||||
|
||||
print(f"No matching CSV file found for channel '{channel_name}' in year '{year}' and month '{month}'.")
|
||||
|
||||
return False
|
||||
|
||||
def shutDownRobot():
|
||||
|
||||
print("shutting down the robot now")
|
||||
|
||||
while True:
|
||||
|
||||
print("checking is file exists... [loop]")
|
||||
|
||||
if check_file(file_to_check):
|
||||
|
||||
print(f"The file '{file_to_check}' exists.")
|
||||
|
||||
print("shutting down the robot")
|
||||
|
||||
shutDownRobot()
|
||||
|
||||
print("robot shut down. breaking. and dying.")
|
||||
|
||||
break
|
||||
|
||||
else:
|
||||
|
||||
print(f"The file '{file_to_check}' does not exist.")
|
||||
|
||||
print("sleeping for some time before checking again...");
|
||||
|
||||
time.sleep(1)
|
||||
31
provision.bash
Normal file
31
provision.bash
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
|
||||
##
|
||||
|
||||
set -e
|
||||
|
||||
set -x
|
||||
|
||||
##
|
||||
|
||||
reset
|
||||
|
||||
clear
|
||||
|
||||
##
|
||||
|
||||
echo "##"
|
||||
echo "## launch > python jms client (aventador JMS)"
|
||||
echo "##"
|
||||
|
||||
sudo apt update;
|
||||
|
||||
sudo apt install pip -y
|
||||
|
||||
pip install stomp.py
|
||||
|
||||
pip install selenium
|
||||
|
||||
## for rest situations
|
||||
|
||||
pip install requests
|
||||
Reference in New Issue
Block a user