Compare commits

...

28 Commits

Author SHA1 Message Date
Richard Mwewa
77ddfa4b02 Update README.md 2022-04-30 10:32:31 +02:00
Richard Mwewa
66192c2a63 Create .log 2022-04-30 10:30:49 +02:00
Richard Mwewa
f591764343 Update banner.py 2022-04-30 10:28:50 +02:00
Richard Mwewa
f6dbd8ec49 Update main.py 2022-04-30 10:27:11 +02:00
Richard Mwewa
99deaf04f3 Update main.py 2022-04-29 23:53:10 +02:00
Richard Mwewa
56eead2f26 Update README.md 2022-04-29 23:46:12 +02:00
Richard Mwewa
73e7c339e6 Update README.md 2022-04-29 23:26:32 +02:00
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
Richard Mwewa
d7980c0726 Delete tmp 2022-04-23 13:33:01 +02:00
Richard Mwewa
f8221d8f58 Update main.py 2022-04-23 13:32:25 +02:00
Richard Mwewa
9d86c4cc7b Update README.md 2022-04-23 13:25:30 +02:00
Richard Mwewa
67db855322 Update banner.py 2022-04-23 13:18:28 +02:00
Richard Mwewa
1b5cfa2ebf Update colors.py 2022-04-23 13:17:37 +02:00
Richard Mwewa
0d2a939388 Update main.py 2022-04-23 13:16:04 +02:00
Richard Mwewa
52c572f255 Update README.md 2022-04-20 00:40:38 +02:00
Richard Mwewa
eeda47723e Update main.py 2022-04-20 00:32:49 +02:00
Richard Mwewa
1a6e3bb3c9 Update banner.py 2022-04-20 00:28:49 +02:00
Richard Mwewa
82b6a3fd3c Update colors.py 2022-04-20 00:27:55 +02:00
Richard Mwewa
c994678fa1 Update README.md 2022-04-18 14:19:37 +02:00
6 changed files with 178 additions and 169 deletions

105
README.md
View File

@@ -1,17 +1,22 @@
![Screenshot_2022-03-17_10-12-53](https://user-images.githubusercontent.com/74001397/158868105-b5aba7e8-7342-4268-bd7a-6d6ae0bdae5a.png) ![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.5.2-alpha?style=for-the-badge&logo=github) ![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/rly0nheart/octosuite/1.9.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)
![PyPI - Downloads](https://img.shields.io/pypi/dw/octosuite?style=for-the-badge&logo=pypi)
> *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
@@ -29,78 +34,9 @@
- [x] Searches commits - [x] Searches commits
- [x] Easily updates with the 'update' command - [x] Easily updates with the 'update' command
- [x] Automatically logs network activity (.logs folder) - [x] Automatically logs network activity (.logs folder)
- [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|
| ------------- |:---------:| | ------------- |:---------:|
@@ -119,21 +55,36 @@ octosuite
| ``search:topics`` | *search topics(s)* | | ``search:topics`` | *search topics(s)* |
| ``search:issues`` | *search issue(s)* | | ``search:issues`` | *search issue(s)* |
| ``search:commits`` | *search commit(s)* | | ``search:commits`` | *search commit(s)* |
| ``logs:view`` | *view octosuite log files* |
| ``logs:read`` | *read a specified log file* |
| ``logs:delete`` | *delete a specified log file* |
| ``update`` | *update octosuite* | | ``update`` | *update octosuite* |
| ``changelog`` | *show changelog* | | ``changelog`` | *show changelog* |
| ``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* ✌🏾🙂
***
# PYPI # PYPI
[PyPI](https://pypi.org/project/octosuite) [PyPI Package](https://pypi.org/project/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)
***
# DONATIONS
Love octosuite? Please consider buying me a coffee, I will appreciate really it. ☕👌🏾😊
<a href="https://www.buymeacoffee.com/189381184" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>

View File

@@ -1,23 +1,25 @@
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
version = 'v1.9.0'
banner = f'''{red} banner = f'''{red}
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████ ▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀ ▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀
▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███ ▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███
▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄ ▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒ ░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░ ░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg}v1.5.2-alpha{reset}{red} ░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg} {version} {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

@@ -1,5 +1,7 @@
import os import os
import sys import sys
import platform
from datetime import datetime
colors = True colors = True
machine = sys.platform machine = sys.platform
@@ -8,21 +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:
try: date_time = datetime.now()
color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? [Y/n] ") sys_info = [("Processor",platform.processor),
if color_chooser.lower() == "y": ("Node", platform.node),
white = "\033[97m" ("Release", platform.release),
white_bg = "\033[47;30m" ("Architecture", platform.architecture),
red = "\033[91m" ("Version", platform.version)]
reset = "\033[0m"
green = "\033[92m"
green_bg = "\033[42;37m"
red_bg = "\033[41;37m"
else:
red = white = green = green_bg = white_bg = red_bg = reset = ""
except KeyboardInterrupt: banner = f"""
exit(f"[ ! ] Process interrupted with Ctrl+C") 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:
try:
color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? (y/n) ")
if color_chooser.lower() == "y":
white = "\033[97m"
red = "\033[91m"
reset = "\033[0m"
green = "\033[92m"
red_bg = "\033[41;37m"
break
elif color_chooser.lower() == "n":
red = white = green = red_bg = reset = ""
break
else:
print(f"\n[ ! ] Your response ({color_chooser}) is invalid (expected y or n)")
except KeyboardInterrupt:
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

@@ -14,15 +14,16 @@
''' '''
import os import os
import sys
import logging import logging
import requests import requests
import platform import platform
import subprocess import subprocess
from tqdm import tqdm from tqdm import tqdm
from pprint import pprint from pprint import pprint
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.banner import banner, version
from lib.colors import red, white, green, red_bg, reset
class octosuite: class octosuite:
def __init__(self): def __init__(self):
@@ -41,6 +42,9 @@ class octosuite:
('search:topics', self.topic_search), ('search:topics', self.topic_search),
('search:issues', self.issue_search), ('search:issues', self.issue_search),
('search:commits', self.commits_search), ('search:commits', self.commits_search),
('logs:view',self.view_logs),
('logs:read',self.read_log),
('logs:delete',self.delete_log),
('update', self.update), ('update', self.update),
('changelog', self.changelog), ('changelog', self.changelog),
('info:dev', self.author), ('info:dev', self.author),
@@ -196,7 +200,8 @@ class octosuite:
# Author dictionary # Author dictionary
self.author_dict = {'Alias': 'rly0nheart', self.author_dict = {'Alias': 'rly0nheart',
'Country': 'Zambia, Africa', 'Country': 'Zambia, Africa',
'About.me': 'https://about.me/rly0nheart'} 'About.me': 'https://about.me/rly0nheart',
'BuyMeACoffee': 'https://buymeacoffee.com/189381184'}
def on_start(self): def on_start(self):
@@ -206,13 +211,13 @@ class octosuite:
# Use 'cls' to clear screen on Windows based machines # Use 'cls' to clear screen on Windows based machines
# Otherwise, use 'clear' # Otherwise, use 'clear'
while True: while True:
if platform.system().lower().startswith(('win','darwin')): if sys.platform.lower().startswith(('win','darwin')):
subprocess.run(['cls']) subprocess.run(['cls'])
else: else:
subprocess.run(['clear'],shell=False) subprocess.run(['clear'],shell=False)
print(banner) print(banner)
command_input = input(f'''{white}┌──({red}{os.getlogin()}{white}@{red}octosuite{white})-[{green}{os.getcwd()}{white}]\n╼[{green}:~{white}]{reset} ''') command_input = input(f'''{white}┌──({red}{os.getlogin()}{white}@{red}octosuite{white})-[{green}{os.getcwd()}{white}]\n└╼[{green}:~{white}]{reset} ''')
# Looping through the commands base to check if the user input command matches any command in the commands base, and return its functionality # Looping through the commands base to check if the user input command matches any command in the commands base, and return its functionality
# If no match is found, we ignore it # If no match is found, we ignore it
for command, functionality in self.commands_base: for command, functionality in self.commands_base:
@@ -221,15 +226,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
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}")
@@ -239,11 +244,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}")
@@ -253,12 +258,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}")
@@ -268,13 +273,13 @@ class octosuite:
# Get path contents # Get path contents
def path_contents(self): def path_contents(self):
username = input(f'\n{white}[{white_bg}@Owner{reset}{white}] (username){reset} ') repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
repo_name = input(f'{white}[{white_bg}%reponame{reset}{white}]{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:
@@ -283,13 +288,13 @@ class octosuite:
print(f'{white}├─ {self.path_attr_dict[attr]}: {green}{item[attr]}{reset}') print(f'{white}├─ {self.path_attr_dict[attr]}: {green}{item[attr]}{reset}')
# Fetching organozation 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:
@@ -301,11 +306,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:
@@ -317,13 +322,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}")
@@ -334,13 +339,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}")
@@ -351,19 +356,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']:
@@ -375,7 +380,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']:
@@ -387,7 +392,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']:
@@ -399,7 +404,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']:
@@ -411,17 +416,46 @@ 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')
# View octosuite log files
def view_logs(self):
logs = os.listdir('.logs')
print(f"\n {red_bg}[LOG] [SIZE] {reset}")
for log in logs:
print(f" {log}\t ",os.path.getsize(".logs/"+log),"bytes")
print(f" {red_bg} {reset}")
# Delete a specified log file
def delete_log(self):
log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
if sys.platform.lower().startswith(('win','darwin')):
subprocess.run(['del',f'{os.getcwd()}/.logs/{log_file}'])
else:
subprocess.run(['sudo','rm',f'.logs/{log_file}'],shell=False)
logging.info(f'Deleted log file: {log_file}')
print(f"{white}[{green} + {white}] Deleted log file: {green}{log_file}{reset}")
# Read a specified log file
def read_log(self):
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:
logging.info(f'Reading log file: {log_file}')
print("\n"+log.read())
# Update program # Update program
def update(self): def update(self):
logging.info('Updating...') logging.info('Updating...')
@@ -433,7 +467,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
@@ -441,14 +475,9 @@ 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.5.2-alpha [CHANGELOG]{reset} {red_bg} {version} [CHANGELOG] {reset}
Users will now get to choose whether to enable colors or not Minor bug fixes and improvements
• Cleaned code {red_bg} {reset}'''
• Improved perfomance
• Will be ignoring unknown commands instead of printing the error
• Major bug fixes
{red_bg} {reset}
'''
print(changelog_text) print(changelog_text)
@@ -459,11 +488,13 @@ class octosuite:
print(f'{white}├─ {key}: {green}{value}{reset}') print(f'{white}├─ {key}: {green}{value}{reset}')
# 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
def help(self): def help(self):
help = f''' help = f'''
@@ -483,12 +514,14 @@ class octosuite:
search:topics Search topic(s) search:topics Search topic(s)
search:issues Search issue(s) search:issues Search issue(s)
search:commits Search commit(s) search:commits Search commit(s)
logs:view View log files
logs:read Read a specified log file
logs:delete Delete a specified log file
update Update octosuite update Update octosuite
changelog Show changelog changelog Show changelog
help Show usage/help help Show usage/help
exit Exit session exit Exit session
{red_bg} {reset} {red_bg} {reset}'''
'''
print(help) print(help)
@@ -500,7 +533,7 @@ else:
# Creating the .logs directory # Creating the .logs directory
# If the current system is Windows based, we run mkdir command without sudo # If the current system is Windows based, we run mkdir command without sudo
# Else we run the mkdir command with sudo # Else we run the mkdir command with sudo
if platform.system().lower().startswith(('win','darwin')): if sys.platform.lower().startswith(('win','darwin')):
subprocess.run(['mkdir','.logs']) subprocess.run(['mkdir','.logs'])
else: else:
subprocess.run(['sudo','mkdir','.logs'],shell=False) subprocess.run(['sudo','mkdir','.logs'],shell=False)