Compare commits

...

10 Commits

Author SHA1 Message Date
Richard Mwewa
3cd6442d91 Update README.md 2022-04-28 01:33:21 +02:00
Richard Mwewa
7ebb90790a Update banner.py 2022-04-28 01:10:39 +02:00
Richard Mwewa
ca0d2dc268 Update main.py 2022-04-28 01:08:26 +02:00
Richard Mwewa
51babb3c45 Update README.md 2022-04-27 17:09:33 +02:00
Richard Mwewa
12e9dbcae9 Update main.py 2022-04-27 15:31:31 +02:00
Richard Mwewa
be4e88d99b Update banner.py 2022-04-27 15:29:53 +02:00
Richard Mwewa
f7ac0fb8d5 Update colors.py 2022-04-27 15:28:07 +02:00
Richard Mwewa
fc7a65c593 Update octosuite 2022-04-27 15:25:15 +02:00
Richard Mwewa
51f2a46c65 Delete tmp 2022-04-23 14:10:18 +02:00
Richard Mwewa
4afbc5adaa Create tmp 2022-04-23 14:09:35 +02:00
5 changed files with 98 additions and 146 deletions

View File

@@ -1,14 +1,22 @@
![octosuite](https://user-images.githubusercontent.com/74001397/165550323-d880e320-a4c0-4f4e-87dd-d2e8319554ec.png)
![OS](https://img.shields.io/badge/OS-GNU%2FLinux-red?style=for-the-badge&logo=Linux) ![OS](https://img.shields.io/badge/OS-GNU%2FLinux-red?style=for-the-badge&logo=Linux)
![OS](https://img.shields.io/badge/OS-Windows-blue?style=for-the-badge&logo=Windows) ![OS](https://img.shields.io/badge/OS-Windows-blue?style=for-the-badge&logo=Windows)
![OS](https://img.shields.io/badge/OS-Mac-white?style=for-the-badge&logo=apple) ![OS](https://img.shields.io/badge/OS-Mac-white?style=for-the-badge&logo=apple)
![GitHub](https://img.shields.io/github/license/rly0nheart/octosuite?style=for-the-badge&logo=github) ![GitHub](https://img.shields.io/github/license/rly0nheart/octosuite?style=for-the-badge&logo=github)
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/rly0nheart/octosuite?style=for-the-badge&logo=github) ![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/rly0nheart/octosuite?style=for-the-badge&logo=github)
![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/rly0nheart/octosuite/1.7.0-dev?style=for-the-badge&logo=github) ![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/rly0nheart/octosuite/1.8.0?style=for-the-badge&logo=github)
![GitHub last commit](https://img.shields.io/github/last-commit/rly0nheart/octosuite?style=for-the-badge&logo=github) ![GitHub last commit](https://img.shields.io/github/last-commit/rly0nheart/octosuite?style=for-the-badge&logo=github)
![GitHub repo size](https://img.shields.io/github/repo-size/rly0nheart/octosuite?style=for-the-badge&logo=github) ![GitHub repo size](https://img.shields.io/github/repo-size/rly0nheart/octosuite?style=for-the-badge&logo=github)
> *Simply gather OSINT on Github users & organizations like a God🔥* > *Simply gather OSINT on Github users & organizations like a God🔥*
# INSTALLATION
Installation instructions are on the wiki, in addition to all other documentation.
[Refer to the Wiki](https://github.com/rly0nheart/octosuite/wiki)
***
# FEATURES # FEATURES
- [x] Fetches organization info - [x] Fetches organization info
- [x] Fetches user info - [x] Fetches user info
@@ -28,77 +36,7 @@
- [x] Automatically logs network activity (.logs folder) - [x] Automatically logs network activity (.logs folder)
- [x] User can view, read and delete log files - [x] User can view, read and delete log files
# INSTALLATION ***
## Clone from Github
```
git clone https://github.com/rly0nheart/octosuite.git
```
![Screenshot_20220414-002508](https://user-images.githubusercontent.com/74001397/163280996-ed0f8817-c3e3-49d8-9e15-93452cb08a3e.jpg)
```
cd octosuite
```
![Screenshot_20220414-002214](https://user-images.githubusercontent.com/74001397/163281317-158bbf7b-073f-457e-8a8a-730d4c0ed413.jpg)
```
pip install -r requirements.txt
```
![Screenshot_20220414-004420](https://user-images.githubusercontent.com/74001397/163282481-6cb5efe8-6e5a-4c2b-a8b5-7ff99f7ca293.jpg)
## Install from PyPI
```
pip install octosuite
```
![Screenshot_20220414-005400](https://user-images.githubusercontent.com/74001397/163283184-e9458439-8074-4338-938b-4588390bb6b7.jpg)
# GITHUB FORK USAGE
## Linux
```
sudo chmod +x octosuite
```
![Screenshot_20220414-004443](https://user-images.githubusercontent.com/74001397/163282620-a5307969-bcce-49d1-ad3c-c3ea0f78fb44.jpg)
```
sudo ./octosuite
```
![Screenshot_20220414-004507](https://user-images.githubusercontent.com/74001397/163282716-41ace7fc-ee04-4c95-985e-68dd3286682c.jpg)
## Windows
```
python3 octosuite
```
## Mac
```
python3 octosuite
```
# PYPI PACKAGE USAGE
## Linux
```
octosuite
```
## Windows
```
octosuite
```
## Mac
```
octosuite
```
# AVAILABLE COMMANDS # AVAILABLE COMMANDS
| COMMAND | DESCRIPTION| | COMMAND | DESCRIPTION|
| ------------- |:---------:| | ------------- |:---------:|
@@ -125,19 +63,22 @@ octosuite
| ``help`` | *show usage/help* | | ``help`` | *show usage/help* |
| ``exit`` | *exit session* | | ``exit`` | *exit session* |
***
# NOTE # NOTES
* *octosuite automatically logs network and minor user activity. The logs are saved by date and time in .logs folder* * *octosuite automatically logs network and minor user activity. The logs are saved by date and time in .logs folder*
* *Although octosuite was developed to work on **Mac**, **Windows**, or any **Linux** *Distribution*, it has only been tested on **Termux** *and* **Kali Linux*** * *Although octosuite was developed to work on **Mac**, **Windows**, or any **Linux** *Distribution*, it has only been tested on **Termux** *and* **Kali Linux***
* *If you believe octosuite can be better, feel free to open a pull request with your improvements* ✌🏾🙂 * *If you believe octosuite can be better, feel free to open a pull request with your improvements* ✌🏾🙂
***
# PYPI # PYPI
[PyPI Package](https://pypi.org/project/octosuite) [PyPI Package](https://pypi.org/project/octosuite)
![PyPI Downloads](https://pepy.tech/badge/octosuite) ![PyPI Downloads](https://pepy.tech/badge/octosuite)
***
# LICENSE # LICENSE
![license](https://user-images.githubusercontent.com/74001397/137917929-2f2cdb0c-4d1d-4e4b-9f0d-e01589e027b5.png) ![license](https://user-images.githubusercontent.com/74001397/137917929-2f2cdb0c-4d1d-4e4b-9f0d-e01589e027b5.png)
***
# ABOUT DEVELOPER # ABOUT DEVELOPER
[About.me](https://about.me/rly0nheart) [About.me](https://about.me/rly0nheart)

View File

@@ -1,23 +1,23 @@
import os import os
from lib.colors import red,white,white_bg,red_bg,reset from lib.colors import red, white, green, red_bg,reset
banner = f'''{red} banner = f'''{red}
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████ ▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀ ▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀
▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███ ▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███
▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄ ▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒ ░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░ ░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg}v1.7.0-dev{reset}{red} ░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg} v1.8.0 {reset}{red}
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
{white}— Advanced Github {red}OSINT{white} Framework{reset} {white}— Advanced Github {red}OSINT{white} Framework{reset}
> {white}Current user: {white_bg}{os.getlogin()}{reset} > {white}Current user: {green}{os.getlogin()}{reset}
> {white}Use {white_bg}help{reset}{white} command for usage{reset} > {white}Use {green}help{reset}{white} command for usage{reset}
> {white}Commands are {white_bg}case sensitive{reset} > {white}Commands are case sensitive{reset}
{'-'*30} {'-'*27}
''' '''

View File

@@ -10,28 +10,42 @@ if machine.lower().startswith(("os", "win", "darwin","ios")):
colors = False colors = False
if not colors: if not colors:
reset = red = white = green = green_bg = white_bg = red_bg = "" reset = red = white = green = red_bg = ""
else: else:
date_time = datetime.now() date_time = datetime.now()
print(f"\n\t OCTOSUITE © 2022 Richard Mwewa\n\t{date_time.strftime('%A %d %B %Y, %H:%M:%S%p')}\n\n\nOS: {platform.system()}\nProcessor: {platform.processor()}\nNode: {platform.node()}\nRelease: {platform.release()}\nArchitecture: {platform.architecture()}\nVersion: {platform.version()}\n\n") sys_info = [("Processor",platform.processor),
("Node", platform.node),
("Release", platform.release),
("Architecture", platform.architecture),
("Version", platform.version)]
banner = f"""
OCTOSUITE © 2022 Richard Mwewa
{date_time.strftime('%A %d %B %Y, %H:%M:%S%p')}
{platform.system()}"""
print(banner)
for key, value in sys_info:
print(f"\t├─ {key}: {value()}")
print("\n")
while True: while True:
try: try:
color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? (y/n) ") color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? (y/n) ")
if color_chooser.lower() == "y": if color_chooser.lower() == "y":
white = "\033[97m" white = "\033[97m"
white_bg = "\033[47;30m"
red = "\033[91m" red = "\033[91m"
reset = "\033[0m" reset = "\033[0m"
green = "\033[92m" green = "\033[92m"
green_bg = "\033[42;37m"
red_bg = "\033[41;37m" red_bg = "\033[41;37m"
break break
elif color_chooser.lower() == "n": elif color_chooser.lower() == "n":
red = white = green = green_bg = white_bg = red_bg = reset = "" red = white = green = red_bg = reset = ""
break break
else: else:
print(f"\n[ ! ] Your response ({color_chooser}) is invalid (expected y or n)") print(f"\n[ ! ] Your response ({color_chooser}) is invalid (expected y or n)")
except KeyboardInterrupt: except KeyboardInterrupt:
exit(f"[ ! ] Process interrupted with Ctrl+C") exit(f"[ ! ] Process interrupted with (Ctrl+C)")

View File

@@ -2,16 +2,16 @@
import logging import logging
from src.main import * from src.main import *
from lib.colors import red,red_bg,white,reset from lib.colors import red,white,reset
if __name__ == '__main__': if __name__ == '__main__':
try: try:
octosuite().on_start() octosuite().on_start()
except KeyboardInterrupt: except KeyboardInterrupt:
logging.warning('Process interrupted with Ctrl+C') logging.warning('Session terminated with (Ctrl+C)')
exit(f'\n{white}[{red} x {white}] Process interrupted with {red_bg}Ctrl+C{reset}') exit(f'\n{white}[{red} x {white}] Session terminated with ({red}Ctrl{white}+{red}C{reset}{white}).{reset}')
except Exception as e: except Exception as e:
logging.error(f'Session terminated on error: {e}') logging.error(f'Session terminated on error: {e}')
exit(f'\n{white}[{red} ! {white}] Session {red_bg}terminated{reset}{white} on error: {red}{e}{reset}') exit(f'\n{white}[{red} ! {white}] Session terminated on error: {red}{e}{reset}')

View File

@@ -23,7 +23,7 @@ from tqdm import tqdm
from pprint import pprint from pprint import pprint
from lib.banner import banner from lib.banner import banner
from datetime import datetime from datetime import datetime
from lib.colors import red, white, green, green_bg, white_bg, red_bg, reset from lib.colors import red, white, green, red_bg, reset
class octosuite: class octosuite:
def __init__(self): def __init__(self):
@@ -225,15 +225,15 @@ class octosuite:
else: else:
pass pass
input(f'\n{white}[{green} ? {white}] Press {white_bg}any key{reset}{white} to continue{reset} ') input(f'\n{white}[{green} ? {white}] Press any key to continue{reset} ')
# Fetching organization info # Fetching organization info
def org_info(self): def org_info(self):
organization = input(f'\n{white}[{white_bg}@Organization{reset}{white}] (username){reset} ') organization = input(f'\n{white}--> @{green}organization{white} (username){reset} ')
api = f'https://api.github.com/orgs/{organization}' api = f'https://api.github.com/orgs/{organization}'
response = requests.get(api) response = requests.get(api)
if response.status_code != 200: if response.status_code != 200:
print(f'\n{white}[{red}-{white}] Organization @{organization} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] Organization ({organization}) not found.{reset}')
else: else:
response = response.json() response = response.json()
print(f"\n{white}{response['name']}{reset}") print(f"\n{white}{response['name']}{reset}")
@@ -243,11 +243,11 @@ class octosuite:
# Fetching user information # Fetching user information
def user_profile(self): def user_profile(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ') username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}' api = f'https://api.github.com/users/{username}'
response = requests.get(api) response = requests.get(api)
if response.status_code != 200: if response.status_code != 200:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else: else:
response = response.json() response = response.json()
print(f"\n{white}{response['name']}{reset}") print(f"\n{white}{response['name']}{reset}")
@@ -257,12 +257,12 @@ class octosuite:
# Fetching repository information # Fetching repository information
def repo_info(self): def repo_info(self):
repo_name = input(f'\n{white}[{white_bg}%reponame{reset}{white}]{reset} ') repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
username = input(f'{white}[{white_bg}@Owner{reset}{white}] (username){reset} ') username = input(f'{white}--> @{green}owner{white} (username){reset} ')
api = f'https://api.github.com/repos/{username}/{repo_name}' api = f'https://api.github.com/repos/{username}/{repo_name}'
response = requests.get(api) response = requests.get(api)
if response.status_code != 200: if response.status_code != 200:
print(f'\n{white}[{red} - {white}] Repository %{repo_name} or user @{username} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] Repository ({repo_name}) or user ({username}) not found.{reset}')
else: else:
response = response.json() response = response.json()
print(f"\n{white}{response['full_name']}{reset}") print(f"\n{white}{response['full_name']}{reset}")
@@ -272,13 +272,13 @@ class octosuite:
# Get path contents # Get path contents
def path_contents(self): def path_contents(self):
repo_name = input(f'\n{white}[{white_bg}%reponame{reset}{white}]{reset} ') repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
username = input(f'{white}[{white_bg}@Owner{reset}{white}] (username){reset} ') username = input(f'{white}--> @{green}owner{white} (username){reset} ')
path_name = input(f'{white}[{white_bg}/path/name{reset}{white}]{reset} ') path_name = input(f'{white}--> ~{green}/path/name{reset} ')
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}' api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
response = requests.get(api) response = requests.get(api)
if response.status_code != 200: if response.status_code != 200:
print(f'\n{white}[{red} - {white}] Information {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] Information not found.{reset}')
else: else:
response = response.json() response = response.json()
for item in response: for item in response:
@@ -289,11 +289,11 @@ class octosuite:
# Fetching organization repositories # Fetching organization repositories
def org_repos(self): def org_repos(self):
organization = input(f'\n{white}[{white_bg}@Organization{reset}{white}] (username){reset} ') organization = input(f'\n{white}--> @{green}organization{white} (username){reset} ')
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100' api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
response = requests.get(api) response = requests.get(api)
if response.status_code != 200: if response.status_code != 200:
print(f'\n{white}[{red} - {white}] Organization @{organization} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] Organization ({organization}) not found.{reset}')
else: else:
response = response.json() response = response.json()
for repo in response: for repo in response:
@@ -305,11 +305,11 @@ class octosuite:
# Fetching user repositories # Fetching user repositories
def user_repos(self): def user_repos(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ') username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}/repos?per_page=100' api = f'https://api.github.com/users/{username}/repos?per_page=100'
response = requests.get(api) response = requests.get(api)
if response.status_code != 200: if response.status_code != 200:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else: else:
response = response.json() response = response.json()
for repo in response: for repo in response:
@@ -321,13 +321,13 @@ class octosuite:
# Fetching user's gists # Fetching user's gists
def user_gists(self): def user_gists(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ') username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}/gists' api = f'https://api.github.com/users/{username}/gists'
response = requests.get(api).json() response = requests.get(api).json()
if response == []: if response == []:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}does not{reset}{white} have any active gists.{reset}') print(f'\n{white}[{red} - {white}] User ({username}) does not have any active gists.{reset}')
elif "Not Found" in response['message']: elif "not found" in response['message']:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else: else:
for item in response: for item in response:
print(f"\n{white}{item['id']}{reset}") print(f"\n{white}{item['id']}{reset}")
@@ -338,13 +338,13 @@ class octosuite:
# Fetching user's followera' # Fetching user's followera'
def followers(self): def followers(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ') username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}/followers?per_page=100' api = f'https://api.github.com/users/{username}/followers?per_page=100'
response = requests.get(api).json() response = requests.get(api).json()
if response == []: if response == []:
print(f'\n{white}[{red} - {white}]User @{username} {red_bg}does not{reset}{white} have followers.{reset}') print(f'\n{white}[{red} - {white}]User ({username}) does not have followers.{reset}')
elif "Not Found" in response['message']: elif "not found" in response['message']:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}') print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else: else:
for item in response: for item in response:
print(f"\n{white}@{item['login']}{reset}") print(f"\n{white}@{item['login']}{reset}")
@@ -355,19 +355,19 @@ class octosuite:
# Checking whether or not user[A] follows user[B] # Checking whether or not user[A] follows user[B]
def following(self): def following(self):
user_a = input(f'\n{white}[{white_bg}@User A{reset}{white}] (username){reset} ') user_a = input(f'\n{white}--> @{green}user{white}[A] (username){reset} ')
user_b = input(f'{white}[{white_bg}@User B{reset}{white}] (username){reset} ') user_b = input(f'{white}--> @{green}user{white}[B] (username){reset} ')
api = f'https://api.github.com/users/{user_a}/following/{user_b}' api = f'https://api.github.com/users/{user_a}/following/{user_b}'
response = requests.get(api) response = requests.get(api)
if response.status_code == 204: if response.status_code == 204:
print(f'\n{white}[{green} + {white}] @{user_a} {green_bg}follows{reset}{white} @{user_b}.{reset}') print(f'\n{white}[{green} + {white}] @{user_a} follows @{user_b}.{reset}')
else: else:
print(f'\n{white}[{red} - {white}] @{user_a} {red_bg}does not{reset}{white} follow @{user_b}.{reset}') print(f'\n{white}[{red} - {white}] @{user_a} does not follow @{user_b}.{reset}')
# User search # User search
def user_search(self): def user_search(self):
query = input(f'\n{white}[{white_bg}#@Query{reset}{white}]{reset} ') query = input(f'\n{white}--> @{green}query{white} (eg. john){reset} ')
api = f'https://api.github.com/search/users?q={query}&per_page=100' api = f'https://api.github.com/search/users?q={query}&per_page=100'
response = requests.get(api).json() response = requests.get(api).json()
for item in response['items']: for item in response['items']:
@@ -379,7 +379,7 @@ class octosuite:
# Repository search # Repository search
def repo_search(self): def repo_search(self):
query = input(f'\n{white}[{white_bg}#%Query{reset}{white}]{reset} ') query = input(f'\n{white}--> %{green}query{white} (eg. git){reset} ')
api = f'https://api.github.com/search/repositories?q={query}&per_page=100' api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
response = requests.get(api).json() response = requests.get(api).json()
for item in response['items']: for item in response['items']:
@@ -391,7 +391,7 @@ class octosuite:
# Topics search # Topics search
def topic_search(self): def topic_search(self):
query = input(f'\n{white}[{white_bg}##Query{reset}{white}]{reset} ') query = input(f'\n{white}--> #{green}query{white} (eg. osint){reset} ')
api = f'https://api.github.com/search/topics?q={query}&per_page=100' api = f'https://api.github.com/search/topics?q={query}&per_page=100'
response = requests.get(api).json() response = requests.get(api).json()
for item in response['items']: for item in response['items']:
@@ -403,7 +403,7 @@ class octosuite:
# Issue search # Issue search
def issue_search(self): def issue_search(self):
query = input(f'\n{white}[{white_bg}#!Query{reset}{white}]{reset} ') query = input(f'\n{white}--> !{green}query{white} (eg. error){reset} ')
api = f'https://api.github.com/search/issues?q={query}&per_page=100' api = f'https://api.github.com/search/issues?q={query}&per_page=100'
response = requests.get(api).json() response = requests.get(api).json()
for item in response['items']: for item in response['items']:
@@ -415,13 +415,13 @@ class octosuite:
# Commits search # Commits search
def commits_search(self): def commits_search(self):
query = input(f'\n{white}[{white_bg}#:Query{reset}{white}]{reset} ') query = input(f'\n{white}--> :{green}query{white} (eg. filename:index.php){reset} ')
api = f'https://api.github.com/search/commits?q={query}&per_page=100' api = f'https://api.github.com/search/commits?q={query}&per_page=100'
response = requests.get(api).json() response = requests.get(api).json()
number=0 number=0
for item in response['items']: for item in response['items']:
number+=1 number+=1
print(f'{white}{number}.{reset}') print(f'\n{white}-> {number}.{reset}')
pprint(item['commit']) pprint(item['commit'])
print('\n') print('\n')
@@ -437,7 +437,7 @@ class octosuite:
# Delete a specified log file # Delete a specified log file
def delete_log(self): def delete_log(self):
log_file = input(f"\n{white}[{white_bg}logfile{reset}{white}]{reset} ") log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
if sys.platform.lower().startswith(('win','darwin')): if sys.platform.lower().startswith(('win','darwin')):
subprocess.run(['del',f'{os.getcwd()}/.logs/{log_file}']) subprocess.run(['del',f'{os.getcwd()}/.logs/{log_file}'])
else: else:
@@ -449,7 +449,7 @@ class octosuite:
# Read a specified log file # Read a specified log file
def read_log(self): def read_log(self):
log_file = input(f"\n{white}[{white_bg}logfile{reset}{white}]{reset} ") log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
with open(f'.logs/{log_file}', 'r') as log: with open(f'.logs/{log_file}', 'r') as log:
logging.info(f'Reading log file: {log_file}') logging.info(f'Reading log file: {log_file}')
print("\n"+log.read()) print("\n"+log.read())
@@ -466,7 +466,7 @@ class octosuite:
code.close() code.close()
logging.info('Update complete.') logging.info('Update complete.')
exit(f'{white}[{green} + {white}] {green_bg}Updated{reset}{white} successfully. Re-run octosuite.{reset}') exit(f'{white}[{green} + {white}] Update complete. Re-run octosuite.{reset}')
# Show changelog # Show changelog
@@ -474,13 +474,10 @@ class octosuite:
# lol yes the changelog is hard coded # lol yes the changelog is hard coded
changelog_text = f''' changelog_text = f'''
{red_bg}v1.7.0-dev [CHANGELOG] {reset} {red_bg} v1.8.0 [CHANGELOG] {reset}
• Changed (y/n) behavior in color chooser (where any input apart from 'y' was considered as 'n') • Cleaned code
Added 'logs:view' command for viewing octosuite logs Changes and improvements (noticeable)
• Added 'logs:read' command for reading a specified log file {red_bg} {reset}'''
• Added 'logs:delete' command for deleting a specified log file
• Minor improvements
{red_bg} {reset}'''
print(changelog_text) print(changelog_text)
@@ -493,8 +490,8 @@ class octosuite:
# Close session # Close session
def exit_session(self): def exit_session(self):
logging.info('Session closed with \'exit\' command.') logging.info('Session closed with (exit) command.')
exit(f'\n{white}[{green} ! {white}] Session closed with {white_bg}exit{reset}{white} command.{reset}') exit(f'\n{white}[{green} ! {white}] Session closed with ({green}exit{reset}{white}) command.{reset}')
# Help/usage # Help/usage