Compare commits

..

24 Commits
1.2.0 ... 1.5.0

Author SHA1 Message Date
Richard Mwewa
d5119a87b0 Update banner.py 2022-04-01 02:26:53 +02:00
Richard Mwewa
c4bd431620 Update main.py 2022-04-01 02:26:06 +02:00
Richard Mwewa
fe16b23fc7 Update banner.py 2022-03-31 12:54:23 +02:00
Richard Mwewa
8156af38d5 Update main.py 2022-03-31 12:53:29 +02:00
Richard Mwewa
6fb6a0ec98 Update main.py 2022-03-28 13:33:54 +02:00
Richard Mwewa
dc2a22aae0 Update dependabot.yml 2022-03-28 13:22:03 +02:00
Richard Mwewa
a2aac88da3 Create dependabot.yml 2022-03-28 13:09:04 +02:00
Richard Mwewa
3dbfc0f18e Update README.md 2022-03-28 12:52:56 +02:00
Richard Mwewa
392b3022d7 Update main.py 2022-03-27 23:01:12 +02:00
Richard Mwewa
162d36d741 Update main.py 2022-03-27 22:52:44 +02:00
Richard Mwewa
49490ed95b Update README.md 2022-03-27 22:49:42 +02:00
Richard Mwewa
78966551ee Update main.py 2022-03-27 22:47:47 +02:00
Richard Mwewa
a939b89d23 Update requirements.txt 2022-03-27 22:32:08 +02:00
Richard Mwewa
f79ce44bc9 Update colors.py 2022-03-27 22:31:04 +02:00
Richard Mwewa
7e45fa5669 Update banner.py 2022-03-27 22:27:57 +02:00
Richard Mwewa
f55e1b3895 Update README.md 2022-03-27 22:22:15 +02:00
Richard Mwewa
1ea78c2e0b Update README.md 2022-03-27 22:21:30 +02:00
Richard Mwewa
2272e7ff81 Update main.py 2022-03-27 22:13:08 +02:00
Richard Mwewa
44ce7799f4 Update README.md 2022-03-17 21:33:31 +02:00
Richard Mwewa
6c6fc477f8 v1.2.0 2022-03-17 21:27:39 +02:00
Richard Mwewa
d7060e33dd v1.2.0 2022-03-17 21:25:26 +02:00
Richard Mwewa
b47b073af4 Create requirements.txt 2022-03-17 21:22:10 +02:00
Richard Mwewa
4f196660bc v1.2.0 2022-03-17 21:21:15 +02:00
Richard Mwewa
e073d63845 v1.2.0 2022-03-17 21:13:00 +02:00
6 changed files with 160 additions and 108 deletions

13
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,13 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
# Enable version updates for pip
- package-ecosystem: "pip"
directory: "/" # Location of package manifests
# Check the tqdm registry for updates every day (weekdays)
schedule:
interval: "daily"

View File

@@ -4,65 +4,92 @@
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/rly0nheart/octosuite?style=for-the-badge&logo=github)
![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-Mac-blue?style=for-the-badge&logo=apple)
![GitHub](https://img.shields.io/github/license/rly0nheart/octosuite?style=for-the-badge&logo=github)
![Lines of code](https://img.shields.io/tokei/lines/github/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 and organizations like a god🔥*
# FEATURES
- [x] Fetches organization info
- [x] Fetches user info
- [x] Fetches repository info
- [x] Returns contents of a path from a repository
- [x] Returns a list of repos owned by an organization
- [x] Returns a list of repos owned by a user
- [x] Returns a list of gists owned by a user
- [x] Returns a list of a user's followers
- [x] Checks whether user A follows user B
- [x] Searches users
- [x] Searches repositories
- [x] Searches topics
- [x] Searches issues
- [x] Searches commits
- [x] Easily updates with the 'update' command
- [x] Automatically logs network activity (.logs folder)
# INSTALLATION
**clone project**:
```
$ git clone https://github.com/rly0nheart/octosuite.git
git clone https://github.com/rly0nheart/octosuite.git
```
```
$ cd octosuite
cd octosuite
```
```
pip install -r requirements.txt
```
# USAGE
**Linux**:
```
$ sudo chmod +x octosuite
sudo chmod +x octosuite
```
```
$ ./octosuite
sudo ./octosuite
```
**Windows**:
```
$ python3 octosuite
python3 octosuite
```
**Mac**:
```
python3 octosuite
```
# AVAILABLE COMMANDS
| Command | Usage|
| ------------- |:---------:|
| <code>orginfo</code> | *get organization info* |
| <code>userinfo</code> | *get user profile info* |
| <code>repoinfo</code> | *get repository info* |
| <code>pathcontents</code> | *get contents of a path from a specified repository* |
| <code>orgrepos</code> | *get a list of repositories owned by a specified organization* |
| <code>userrepos</code> | *get a list of repositories owned by a specified user* |
| <code>usergists</code> | *get a list of gists owned by a specified user* |
| <code>userfollowers</code> | *get a list of a user's followers* |
| <code>userfollowing</code> | *check whether user A follows user B* |
| <code>usersearch</code> | *search user(s)* |
| <code>reposearch</code> | *search repositor(y)(ies)* |
| <code>topicsearch</code> | *search topics(s)* |
| <code>issuesearch</code> | *search issue(s)* |
| <code>commitsearch</code> | *search commit(s)* |
| <code>usersearch</code> | *search user(s)* |
| <code>update</code> | *check for/download updates* |
| <code>author</code> | *show author info* |
| <code>help</code> | *show usage/help* |
| <code>exit</code> | *exit session* |
| ``orginfo`` | *get organization info* |
| ``userinfo`` | *get user profile info* |
| ``repoinfo`` | *get repository info* |
| ``pathcontents`` | *get contents of a path from a specified repository* |
| ``orgrepos`` | *get a list of repositories owned by a specified organization* |
| ``userrepos`` | *get a list of repositories owned by a specified user* |
| ``usergists`` | *get a list of gists owned by a specified user* |
| ``userfollowers`` | *get a list of a user's followers* |
| ``userfollowing`` | *check whether user A follows user B* |
| ``usersearch`` | *search user(s)* |
| ``reposearch`` | *search repositor(y)(ies)* |
| ``topicsearch`` | *search topics(s)* |
| ``issuesearch`` | *search issue(s)* |
| ``commitsearch`` | *search commit(s)* |
| ``update`` | *update octosuite* |
| ``changelog`` | *show changelog* |
| ``author`` | *show author info* |
| ``help`` | *show usage/help* |
| ``exit`` | *exit session* |
# NOTE
* *octosuite automatically logs network and minor user activity. The logs are saved by date and time in .logs folder*
* *octosuite has only been tested on **Termux** *and* **Kali Linux** (for now), please be sure to let me know how it works on **Windows***
* *Although octosuite was developed to work on **Mac**, **Windows**, or any **Linux** *Distribution*, it has only been tested on **Termux** *and* **Kali Linux***
# LICENSE
![license](https://user-images.githubusercontent.com/74001397/137917929-2f2cdb0c-4d1d-4e4b-9f0d-e01589e027b5.png)

View File

@@ -7,7 +7,7 @@ banner = f'''{red}
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ v1.1.0
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ v1.5.0
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
{white}— Advanced Github {red}OSINT{white} Framework{reset}

View File

@@ -1,9 +1,10 @@
import sys
# Colors will be unavailable on non-linux machines
colors = True
machine = sys.platform # Detecting the os
machine = sys.platform
if machine.lower().startswith(("os", "win", "darwin")):
colors = False # Colors will not be displayed
colors = False
if not colors:
reset = red = white = green = ""

2
requirements.txt Normal file
View File

@@ -0,0 +1,2 @@
tqdm
requests

View File

@@ -1,18 +1,14 @@
import os
import logging
import requests
import platform
import subprocess
import urllib.request
from tqdm import tqdm
from pprint import pprint
from lib import colors,banner
from lib.banner import banner
from datetime import datetime
try:
import requests
except ImportError:
print(f'{colors.white}[{colors.green}*{colors.white}] Installing requirement(s). Please wait...{colors.reset}')
subprocess.run(['pip', 'install', 'requests'],shell=False)
exit(f'{colors.white}[{colors.green}+{colors.white}] Installation complete. Re-run octosuite.{colors.reset}')
from lib.colors import red, white, green, reset
class octosuite:
def __init__(self):
@@ -155,9 +151,6 @@ class octosuite:
# Author dictionary
self.author_dict = {'Alias': 'rly0nheart',
'Country': 'Zambia, Africa',
'Github': 'https://github.com/rly0nheart',
'Twitter': 'https://twitter.com/rly0nheart',
'Facebook': 'https://fb.me/rly0nheart',
'About.me': 'https://about.me/rly0nheart'}
def on_start(self):
@@ -168,8 +161,8 @@ class octosuite:
else:
subprocess.run(['clear'],shell=False)
print(banner.banner)
command = input(f'''{colors.white}┌─({colors.red}{platform.node()}{colors.white}@{colors.red}octosuite{colors.white})-[{colors.green}{os.getcwd()}{colors.white}]\n└─╼[{colors.green}:~{colors.white}]{colors.reset} ''')
print(banner)
command = input(f'''{white}┌─({red}{platform.node()}{white}@{red}octosuite{white})-[{green}{os.getcwd()}{white}]\n└─╼[{green}:~{white}]{reset} ''')
if command == 'orginfo':
self.org_info()
elif command == 'userinfo':
@@ -200,240 +193,255 @@ class octosuite:
self.commits_search()
elif command == 'update':
self.update()
elif command == 'changelog':
print(self.changelog())
elif command == 'author':
self.author()
elif command == 'help':
print(self.help())
elif command == 'exit':
logging.info('Session terminated.')
exit(f'\n{colors.white}[{colors.red}-{colors.white}] Session terminated.{colors.reset}')
exit(f'\n{white}[{red}-{white}] Session terminated.{reset}')
else:
print(f'\n{colors.white}[{colors.red}!{colors.white}] Unknown command: {command}{colors.reset}')
print(f'\n{white}[{red}!{white}] Unknown command: {command}{reset}')
logging.warning(f'Unknown command: {command}')
input(f'\n{colors.white}^ Press any key to continue{colors.reset} ')
input(f'\n{white}^ Press any key to continue{reset} ')
def org_info(self):
organization = input(f'{colors.white}@{colors.green}Organization{colors.white} >> {colors.reset}')
organization = input(f'{white}@{green}Organization{white} >> {reset}')
api = f'https://api.github.com/orgs/{organization}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{colors.white}[{colors.red}-{colors.white}] Organization @{organization} {colors.red}Not Found{colors.reset}')
print(f'\n{white}[{red}-{white}] Organization @{organization} {red}Not Found{reset}')
else:
response = response.json()
print(f"\n{colors.white}{response['name']}{colors.reset}")
print(f"\n{white}{response['name']}{reset}")
for attr in self.org_attrs:
print(f'{colors.white}├─ {self.org_attr_dict[attr]}: {colors.green}{response[attr]}{colors.reset}')
print(f'{white}├─ {self.org_attr_dict[attr]}: {green}{response[attr]}{reset}')
# Fetching user information
def user_profile(self):
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
username = input(f'{white}@{green}Username{white} >> {reset}')
api = f'https://api.github.com/users/{username}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{colors.white}[{colors.red}-{colors.white}] User @{username} {colors.red}Not Found{colors.reset}')
print(f'\n{white}[{red}-{white}] User @{username} {red}Not Found{reset}')
else:
response = response.json()
print(f"\n{colors.white}{response['name']}{colors.reset}")
print(f"\n{white}{response['name']}{reset}")
for attr in self.profile_attrs:
print(f'{colors.white}├─ {self.profile_attr_dict[attr]}: {colors.green}{response[attr]}{colors.reset}')
print(f'{white}├─ {self.profile_attr_dict[attr]}: {green}{response[attr]}{reset}')
# Fetching repository information
def repo_info(self):
username = input(f'{colors.white}@{colors.green}Owner-username{colors.white} >> {colors.reset}')
repo_name = input(f'{colors.white}%{colors.green}reponame{colors.white} >> {colors.reset}')
username = input(f'{white}@{green}Owner-username{white} >> {reset}')
repo_name = input(f'{white}%{green}reponame{white} >> {reset}')
api = f'https://api.github.com/repos/{username}/{repo_name}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{colors.white}[{colors.red}-{colors.white}] Repository %{repo_name} {colors.red}Not Found{colors.reset}')
print(f'\n{white}[{red}-{white}] Repository %{repo_name} {red}Not Found{reset}')
else:
response = response.json()
print(f"\n{colors.white}{response['full_name']}{colors.reset}")
print(f"\n{white}{response['full_name']}{reset}")
for attr in self.repo_attrs:
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{response[attr]}{colors.reset}")
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{response[attr]}{reset}")
# Get path contents
def path_contents(self):
username = input(f'{colors.white}@{colors.green}Owner-username{colors.white} >> {colors.reset}')
repo_name = input(f'{colors.white}%{colors.green}reponame{colors.white} >> {colors.reset}')
path_name = input(f'{colors.white}/path/name >>{colors.reset} ')
username = input(f'{white}@{green}Owner-username{white} >> {reset}')
repo_name = input(f'{white}%{green}reponame{white} >> {reset}')
path_name = input(f'{white}/path/name >>{reset} ')
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{colors.white}[{colors.red}-{colors.white}] Information {colors.red}Not Found{colors.reset}')
print(f'\n{white}[{red}-{white}] Information {red}Not Found{reset}')
else:
response = response.json()
for item in response:
print(f"\n{colors.white}{item['name']}{colors.reset}")
print(f"\n{white}{item['name']}{reset}")
for attr in self.path_attrs:
print(f'{colors.white}├─ {self.path_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}')
print(f'{white}├─ {self.path_attr_dict[attr]}: {green}{item[attr]}{reset}')
# Fetching organozation repositories
def org_repos(self):
organization = input(f'{colors.white}@{colors.green}Organization{colors.white} >> {colors.reset}')
organization = input(f'{white}@{green}Organization{white} >> {reset}')
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{colors.white}[{colors.red}-{colors.white}] Organization @{organization} {colors.red}Not Found{colors.reset}')
print(f'\n{white}[{red}-{white}] Organization @{organization} {red}Not Found{reset}')
else:
response = response.json()
for repo in response:
print(f"\n{colors.white}{repo['full_name']}{colors.reset}")
print(f"\n{white}{repo['full_name']}{reset}")
for attr in self.repo_attrs:
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{repo[attr]}{colors.reset}")
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{repo[attr]}{reset}")
print('\n')
# Fetching user repositories
def user_repos(self):
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
username = input(f'{white}@{green}Username{white} >> {reset}')
api = f'https://api.github.com/users/{username}/repos?per_page=100'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{colors.white}[{colors.red}-{colors.white}] User @{username} {colors.red}Not Found{colors.reset}')
print(f'\n{white}[{red}-{white}] User @{username} {red}Not Found{reset}')
else:
response = response.json()
for repo in response:
print(f"\n{colors.white}{repo['full_name']}{colors.reset}")
print(f"\n{white}{repo['full_name']}{reset}")
for attr in self.repo_attrs:
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{repo[attr]}{colors.reset}")
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{repo[attr]}{reset}")
print('\n')
# Fetching user's gists
def user_gists(self):
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
username = input(f'{white}@{green}Username{white} >> {reset}')
api = f'https://api.github.com/users/{username}/gists'
response = requests.get(api).json()
if response == []:
print(f'{colors.white}[{colors.red}-{colors.white}]User @{username} does not have any active gists.{colors.reset}')
print(f'{white}[{red}-{white}]User @{username} does not have any active gists.{reset}')
else:
for item in response:
print(f"\n{colors.white}{item['id']}{colors.reset}")
print(f"\n{white}{item['id']}{reset}")
for attr in self.gists_attrs:
print(f"{colors.white}├─ {self.gists_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
print(f"{white}├─ {self.gists_attr_dict[attr]}: {green}{item[attr]}{reset}")
print('\n')
# Fetching user's followera'
def followers(self):
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
username = input(f'{white}@{green}Username{white} >> {reset}')
api = f'https://api.github.com/users/{username}/followers?per_page=100'
response = requests.get(api).json()
if response == []:
print(f'\n{colors.white}[{colors.red}-{colors.white}]User @{username} does not have followers.{colors.reset}')
print(f'\n{white}[{red}-{white}]User @{username} does not have followers.{reset}')
else:
for item in response:
print(f"\n{colors.white}@{item['login']}{colors.reset}")
print(f"\n{white}@{item['login']}{reset}")
for attr in self.user_attrs:
print(f"{colors.white}├─ {self.user_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
print(f"{white}├─ {self.user_attr_dict[attr]}: {green}{item[attr]}{reset}")
print('\n')
# Checking whether or not user[A] follows user[B]
def following(self):
user_a = input(f'{colors.white}@{colors.green}User[A]{colors.white} >> {colors.reset}')
user_b = input(f'{colors.white}@{colors.green}User[B]{colors.white} >> {colors.reset}')
user_a = input(f'{white}@{green}User[A]{white} >> {reset}')
user_b = input(f'{white}@{green}User[B]{white} >> {reset}')
api = f'https://api.github.com/users/{user_a}/following/{user_b}'
response = requests.get(api)
if response.status_code == 204:
print(f'{colors.white}[{colors.green}+{colors.white}] @{user_a} follows @{user_b}.{colors.reset}')
print(f'{white}[{green}+{white}] @{user_a} follows @{user_b}.{reset}')
else:
print(f'{colors.white}[{colors.red}-{colors.white}] @{user_a} does not follow @{user_b}.{colors.reset}')
print(f'{white}[{red}-{white}] @{user_a} does not follow @{user_b}.{reset}')
# User search
def user_search(self):
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
query = input(f'{white}#{green}Query{white} >> {reset}')
api = f'https://api.github.com/search/users?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
print(f"\n{colors.white}@{item['login']}{colors.reset}")
print(f"\n{white}@{item['login']}{reset}")
for attr in self.user_attrs:
print(f"{colors.white}├─ {self.user_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
print(f"{white}├─ {self.user_attr_dict[attr]}: {green}{item[attr]}{reset}")
print('\n')
# Repository search
def repo_search(self):
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
query = input(f'{white}#{green}Query{white} >> {reset}')
api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
print(f"\n{colors.white}{item['full_name']}{colors.reset}")
print(f"\n{white}{item['full_name']}{reset}")
for attr in self.repo_attrs:
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{item[attr]}{reset}")
print('\n')
# Topics search
def topic_search(self):
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
query = input(f'{white}#{green}Query{white} >> {reset}')
api = f'https://api.github.com/search/topics?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
print(f"\n{colors.white}{item['name']}{colors.reset}")
print(f"\n{white}{item['name']}{reset}")
for attr in self.topic_attrs:
print(f"{colors.white}├─ {self.topic_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
print(f"{white}├─ {self.topic_attr_dict[attr]}: {green}{item[attr]}{reset}")
print('\n')
# Issue search
def issue_search(self):
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
query = input(f'{white}#{green}Query{white} >> {reset}')
api = f'https://api.github.com/search/issues?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
print(f"\n{colors.white}{item['title']}{colors.reset}")
print(f"\n{white}{item['title']}{reset}")
for attr in self.issue_attrs:
print(f"{colors.white}├─ {self.issue_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
print(f"{white}├─ {self.issue_attr_dict[attr]}: {green}{item[attr]}{reset}")
print('\n')
# Commits search
def commits_search(self):
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
query = input(f'{white}#{green}Query{white} >> {reset}')
api = f'https://api.github.com/search/commits?q={query}&per_page=100'
response = requests.get(api).json()
n=0
for item in response['items']:
n+=1
print(f'{colors.white}{n}.{colors.reset}')
print(f'{white}{n}.{reset}')
pprint(item['commit'])
print('\n')
# Update program
def update(self):
logging.info('Checking for update(s)...')
files_to_update = ['src/main.py','lib/banner.py','lib/colors.py','octosuite','LICENSE','README.md']
print(f'\n{colors.white}[{colors.green}*{colors.white}] Fetching update(s). Please wait...{colors.reset}',end='')
for file in files_to_update:
logging.info('Fetching updates...')
files_to_update = ['src/main.py','lib/banner.py','lib/colors.py','octosuite','.github/dependabot.yml','LICENSE','README.md','requirements.txt']
for file in tqdm(files_to_update,desc=f'{white}[{green}*{white}] Updating{reset}'):
data = urllib.request.urlopen(f'https://raw.githubusercontent.com/rly0nheart/octosuite/master/{file}').read()
with open(file, 'wb') as code:
code.write(data)
code.close()
logging.info('Update complete.')
exit(f'\n{colors.white}[{colors.green}+{colors.white}] Update complete. Re-run octosuite.{colors.reset}')
exit(f'{white}[{green}+{white}] Updated successfully. Re-run octosuite.{reset}')
# Show changelog
def changelog(self):
# lol yes the changelog is hard coded
changelog_text = '''
v1.5.0 Changelog:
• Fixed import error in src/main.py
'''
return changelog_text
# Author info
def author(self):
print(f'\n{colors.white}Richard Mwewa (Ritchie){colors.reset}')
print(f'\n{white}Richard Mwewa (Ritchie){reset}')
for key,value in self.author_dict.items():
print(f'{colors.white}├─ {key}: {colors.green}{value}{colors.reset}')
print(f'{white}├─ {key}: {green}{value}{reset}')
def help(self):
help = '''
usage:
help:
Command Descritption
------------ ---------------------------------------------------------
orginfo --> Get target organization info
userinfo --> Get target user profile info
repoinfo --> Get target repository info
@@ -448,7 +456,8 @@ usage:
topicsearch --> Search topic(s)
issuesearch --> Search issue(s)
commitsearch --> Search commit(s)
update --> Check for/download update(s)
update --> Update octosuite
changelog --> Show changelog
author --> Show author info
help --> Show usage/help
exit --> Exit session
@@ -456,5 +465,5 @@ usage:
return help
# Set to automatically monitor and log network and user activity to .log folder
# Set to automatically monitor and log network and user activity into the .logs folder
logging.basicConfig(filename=f'.logs/{datetime.now()}.log',format='[%(asctime)s] %(message)s',level=logging.DEBUG)