Compare commits

..
19 Commits
Author SHA1 Message Date
pancake daeba4ebcf Release 0.5.9 2024-08-31 00:03:48 +02:00
Eli Array Minkoff 5578bee417 Attempt to pull new tags if fetching a tag fails 2024-05-08 00:48:38 +02:00
pancake ab6cce7008 Release 0.5.8 2024-04-30 19:13:06 +02:00
pancake d501129500 Add r2yara for the profiles 2024-04-30 19:12:27 +02:00
pancake 51c1b2ca2c Do not register as installed packages that doesn't exist 2024-04-30 18:59:41 +02:00
pancake 743812b653 More checks 2024-04-30 17:18:34 +02:00
pancake ac3b695012 Add python -m r2env 2024-04-30 17:08:29 +02:00
pancake 00a3db509c Check for a valid package name 2024-04-30 17:07:48 +02:00
pancake ccd7231065 Use updated twine pub oneliner 2024-04-30 16:56:45 +02:00
semgrep.dev on behalf of @trufae 3b8716ea1d Add Semgrep CI 2023-03-29 10:36:34 +00:00
Eli Array Minkoff d6b40cf4b8 Fix pylint complaints 2023-03-03 21:02:07 +01:00
Eli Array Minkoff a4d678511e refactor PackageManager/update_radare2_profiles 2023-03-03 21:02:07 +01:00
Eli Array Minkoff 658ede86d9 Reverse order of radare2 provile versions
This ensures that the order remains in ascending order
2023-03-03 21:02:07 +01:00
Eli Array Minkoff d8fc2f8b71 Remove bundled profiles.json file
No longer used
2023-03-03 21:02:07 +01:00
Eli Array Minkoff 57398126f3 Update help text in README 2023-03-03 21:02:07 +01:00
Eli Array Minkoff f7e211b014 Use GitHub API to generate profiles.json 2023-03-03 21:02:07 +01:00
Murphy 3873eb48a7 Update tox.ini py-test job 2023-03-03 20:57:10 +01:00
Murphy c5ba226b21 Update tox.ini 2023-03-03 20:57:10 +01:00
Lazula 88e68daef5 Fix None in string error from host_distname() on unsupported systems 2023-03-02 18:48:47 +01:00
14 changed files with 169 additions and 259 deletions

No files matched your search

+23
View File
@@ -0,0 +1,23 @@
on:
pull_request: {}
push:
branches:
- main
- master
paths:
- .github/workflows/semgrep.yml
schedule:
# random HH:MM to avoid a load spike on GitHub Actions at 00:00
- cron: 34 10 * * *
name: Semgrep
jobs:
semgrep:
name: Scan
runs-on: ubuntu-20.04
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
container:
image: returntocorp/semgrep
steps:
- uses: actions/checkout@v3
- run: semgrep ci
+3 -1
View File
@@ -7,7 +7,9 @@ all:
pub:
rm -rf dist
$(PYTHON) setup.py sdist
twine upload --repository=pypi --verbose dist/*
twine check dist/*
twine upload -u __token__ --repository-url https://upload.pypi.org/legacy/ --verbose dist/*
#twine upload --repository=pypi --verbose dist/*
install:
$(PIP) install .
+1
View File
@@ -64,6 +64,7 @@ versions - list installed packages
list - list all packages available to r2env
shell - enter a new shell with PATH env var set
purge - remove ~/.r2env
update - update list of available profiles
Environment
+3
View File
@@ -0,0 +1,3 @@
from r2env.repl import main
main()
-235
View File
@@ -1,235 +0,0 @@
{
"r2frida": {
"source": "https://github.com/nowsecure/r2frida",
"versions": [
{
"id": "git",
"packages": {}
}
]
},
"r2dec": {
"source": "https://github.com/wargio/r2dec-js",
"versions": [
{
"id": "git",
"packages": {}
}
]
},
"r2ghidra": {
"source": "https://github.com/radareorg/r2ghidra",
"versions": [
{
"id": "git",
"packages": {}
}
]
},
"r0": {
"source": "https://github.com/radareorg/r0",
"versions": [
{
"id": "git",
"packages": {}
}
]
},
"radare2": {
"source": "https://github.com/radareorg/radare2",
"versions": [
{
"id": "5.3.0",
"packages": {
"w64": "radare2-5.3.0-w64.zip",
"deb_x64": "radare2_5.3.0_amd64.deb"
}
},
{
"id": "5.3.1",
"packages": {
"w64": "radare2-5.3.1-w64.zip",
"mac_x64": "radare2-5.3.1.pkg",
"deb_x64": "radare2_5.3.1_amd64.deb"
}
},
{
"id": "5.4.0",
"packages": {
"w64": "radare2-5.4.0-w64.zip",
"mac_x64": "radare2-5.4.0.pkg",
"deb_x64": "radare2_5.4.0_amd64.deb"
}
},
{
"id": "5.4.2",
"packages": {
"w32": "radare2-5.4.2-w32.zip",
"w64": "radare2-5.4.2-w64.zip",
"mac_x64": "radare2-5.4.2-amd64.pkg",
"mac_arm64": "radare2-5.4.2-m1.pkg",
"deb_i386": "radare2_5.4.2_i386.deb",
"deb_x64": "radare2_5.4.2_amd64.deb"
}
},
{
"id": "5.5.0",
"packages": {
"w32": "radare2-5.5.0-w32.zip",
"w64": "radare2-5.5.0-w64.zip",
"mac_x64": "radare2-5.5.0-amd64.pkg",
"mac_arm64": "radare2-5.5.0-m1.pkg",
"deb_i386": "radare2_5.5.0_i386.deb",
"deb_x64": "radare2_5.5.0_amd64.deb"
}
},
{
"id": "5.5.2",
"packages": {
"w32": "radare2-5.5.2-w32.zip",
"w64": "radare2-5.5.2-w64.zip",
"mac_x64": "radare2-5.5.2-amd64.pkg",
"mac_arm64": "radare2-5.5.2-m1.pkg",
"deb_i386": "radare2_5.5.2_i386.deb",
"deb_x64": "radare2_5.5.2_amd64.deb"
}
},
{
"id": "5.5.4",
"packages": {
"w32": "radare2-5.5.4-w32.zip",
"w64": "radare2-5.5.4-w64.zip",
"mac_x64": "radare2-5.5.4-amd64.pkg",
"mac_arm64": "radare2-5.5.4-m1.pkg",
"deb_i386": "radare2_5.5.4_i386.deb",
"deb_x64": "radare2_5.5.4_amd64.deb"
}
},
{
"id": "5.6.0",
"packages": {
"w32": "radare2-5.6.0-w32.zip",
"w64": "radare2-5.6.0-w64.zip",
"mac_x64": "radare2-5.6.0-amd64.pkg",
"mac_arm64": "radare2-5.6.0-m1.pkg",
"deb_i386": "radare2_5.6.0_i386.deb",
"deb_x64": "radare2_5.6.0_amd64.deb"
}
},
{
"id": "5.6.2",
"packages": {
"w32": "radare2-5.6.2-w32.zip",
"w64": "radare2-5.6.2-w64.zip",
"mac_x64": "radare2-5.6.2-amd64.pkg",
"mac_arm64": "radare2-5.6.2-m1.pkg",
"deb_i386": "radare2_5.6.2_i386.deb",
"deb_x64": "radare2_5.6.2_amd64.deb"
}
},
{
"id": "5.6.4",
"packages": {
"w32": "radare2-5.6.4-w32.zip",
"w64": "radare2-5.6.4-w64.zip",
"mac_x64": "radare2-5.6.4-amd64.pkg",
"mac_arm64": "radare2-5.6.4-m1.pkg",
"deb_i386": "radare2_5.6.4_i386.deb",
"deb_x64": "radare2_5.6.4_amd64.deb"
}
},
{
"id": "5.6.6",
"packages": {
"w32": "radare2-5.6.6-w32.zip",
"w64": "radare2-5.6.6-w64.zip",
"mac_x64": "radare2-5.6.6-amd64.pkg",
"mac_arm64": "radare2-5.6.6-m1.pkg",
"deb_i386": "radare2_5.6.6_i386.deb",
"deb_x64": "radare2_5.6.6_amd64.deb"
}
},
{
"id": "5.6.8",
"packages": {
"w32": "radare2-5.6.8-w32.zip",
"w64": "radare2-5.6.8-w64.zip",
"mac_x64": "radare2-5.6.8-amd64.pkg",
"mac_arm64": "radare2-5.6.8-m1.pkg",
"deb_i386": "radare2_5.6.8_i386.deb",
"deb_x64": "radare2_5.6.8_amd64.deb"
}
},
{
"id": "5.7.0",
"packages": {
"w32": "radare2-5.7.0-w32.zip",
"w64": "radare2-5.7.0-w64.zip",
"mac_x64": "radare2-5.7.0-amd64.pkg",
"mac_arm64": "radare2-5.7.0-m1.pkg",
"deb_i386": "radare2_5.7.0_i386.deb",
"deb_x64": "radare2_5.7.0_amd64.deb"
}
},
{
"id": "5.7.2",
"packages": {
"w32": "radare2-5.7.2-w32.zip",
"w64": "radare2-5.7.2-w64.zip",
"mac_x64": "radare2-5.7.2-amd64.pkg",
"mac_arm64": "radare2-5.7.2-m1.pkg",
"deb_i386": "radare2_5.7.2_i386.deb",
"deb_x64": "radare2_5.7.2_amd64.deb"
}
},
{
"id": "5.7.4",
"packages": {
"w32": "radare2-5.7.4-w32.zip",
"w64": "radare2-5.7.4-w64.zip",
"mac_x64": "radare2-5.7.4-amd64.pkg",
"mac_arm64": "radare2-5.7.4-m1.pkg",
"deb_i386": "radare2_5.7.4_i386.deb",
"deb_x64": "radare2_5.7.4_amd64.deb"
}
},
{
"id": "5.7.6",
"packages": {
"w32": "radare2-5.7.6-w32.zip",
"w64": "radare2-5.7.6-w64.zip",
"mac_x64": "radare2-5.7.6-amd64.pkg",
"mac_arm64": "radare2-5.7.6-m1.pkg",
"deb_i386": "radare2_5.7.6_i386.deb",
"deb_x64": "radare2_5.7.6_amd64.deb"
}
},
{
"id": "5.7.8",
"packages": {
"w32": "radare2-5.7.8-w32.zip",
"w64": "radare2-5.7.8-w64.zip",
"mac_x64": "radare2-5.7.8-amd64.pkg",
"mac_arm64": "radare2-5.7.8-m1.pkg",
"deb_i386": "radare2_5.7.8_i386.deb",
"deb_x64": "radare2_5.7.8_amd64.deb"
}
},
{
"id": "5.8.0",
"packages": {
"w32": "radare2-5.8.0-w32.zip",
"w64": "radare2-5.8.0-w64.zip",
"mac_x64": "radare2-5.8.0-amd64.pkg",
"mac_arm64": "radare2-5.8.0-m1.pkg",
"deb_i386": "radare2_5.8.0_i386.deb",
"deb_x64": "radare2_5.8.0_amd64.deb"
}
},
{
"id": "git",
"packages": {}
}
]
}
}
+3
View File
@@ -170,6 +170,9 @@ class R2Env:
with open(version_file, 'w', encoding="utf-8") as file_desc:
file_desc.write(package)
def update_version_profiles(self):
PackageManager.update_radare2_profiles(self._r2env_path)
def check_if_r2env_initialized(self):
if not os.path.isdir(self._r2env_path):
raise R2EnvException("Not r2env initialized. Execute 'r2env init' first.")
+122 -19
View File
@@ -5,8 +5,10 @@ import shutil
import time
from urllib.error import URLError
import zipfile
import json
import wget
import requests
from r2env.exceptions import PackageManagerException
from r2env.tools import load_json_file, git_fetch, git_clean, print_console, ERROR, exit_if_not_exists, host_distname
@@ -19,7 +21,7 @@ class PackageManager:
DOWNLOAD_URL = "https://github.com/radareorg/radare2/releases/download/"
def __init__(self, r2env_path):
self._packages = self._load_profiles()
self._packages = self._load_profiles(r2env_path)
self._r2env_path = r2env_path
def get_package_path(self, package_name):
@@ -38,13 +40,110 @@ class PackageManager:
return res
@staticmethod
def _load_profiles():
filename = os.path.join(os.path.dirname(__file__), 'config', 'profiles.json')
def _load_profiles(r2env_path):
filename = os.path.join(r2env_path, 'profiles.json')
# if profiles.json doesn't exist, generate it now
if not os.path.exists(filename):
print_console(f"NOTE: {filename} does not exist. Generating it now.")
PackageManager.update_radare2_profiles(r2env_path)
profiles = load_json_file(filename)
if not profiles:
raise PackageManagerException("No profiles configured.")
return profiles
@staticmethod
def update_radare2_profiles(r2env_path):
gh_release_info_req = requests.get(
"https://api.github.com/repos/radareorg/radare2/releases",
{"headers": ["X-GitHub-Api-Version: 2022-11-28", "Accept: application/vnd.github+json"]},
timeout=10 # 10-second timeout for API request
)
gh_release_info_req.raise_for_status() # raise an error if the request got a bad return code
gh_release_info = gh_release_info_req.json()
radare2_versions = [{'id': 'git', 'packages': {}}] # include the git version by default
for release in gh_release_info:
version = {'id': release['tag_name'], 'packages': {}}
# generate a list of downloadable assets for this release that r2env can use
for asset in release['assets']:
# note: you're about to see 100 lines of hackery to deal with inconsistent naming schemes
# the goal is to include as many valid assets as is reasonable without including any that are not valid
# separate file extension
asset_name, asset_ext = os.path.splitext(asset['name'])
# normalize 'seperators' before splitting into components
asset_ref = asset_name.replace('_', '-').split('-')
# filter out things like r2ios_sdk and r2blob
if asset_ref[0] != 'radare2':
continue
# Some assets don't have the version number in the name, which breaks the following processing.
# None of them are of interest anyway, so just skip them.
if release['tag_name'] not in asset_ref:
continue
# remove the beginning 'radare2'
asset_ref.remove('radare2')
# we don't need to care about the release id when checking, so remove it
asset_ref.remove(release['tag_name'])
# once "radare2" and the version number have been removed from asset_ref,
# if all that's left matches a filter, save it.
_VERSION_FILTERS = {
'.zip': { # used for Windows builds among other things
'w32': [['w32']],
'w64': [['w64']]
},
'.deb': {
'deb_i386': [['i386']],
'deb_x64': [['amd64']]
},
'.pkg': { # macOS bundle
'mac_arm64': [['m1']],
'mac_x64': [[], ['amd64'], ['x64'], ['macos']]
}
}
if asset_ext in _VERSION_FILTERS:
for platform, refs in _VERSION_FILTERS[asset_ext].items():
if asset_ref in refs:
version['packages'][platform] = asset['name']
break
radare2_versions.append(version)
profiles = {
'r2frida': {
'source': 'https://github.com/nowsecure/r2frida',
'versions': [{'id': 'git', 'packages': {}}]
},
'r2dec': {
'source': 'https://github.com/wargio/r2dec-js',
'versions': [{'id': 'git', 'packages': {}}]
},
'r2yara': {
'source': 'https://github.com/radareorg/r2yara',
'versions': [{'id': 'git', 'packages': {}}]
},
'r2ghidra': {
'source': 'https://github.com/radareorg/r2ghidra',
'versions': [{'id': 'git', 'packages': {}}]
},
'r0': {
'source': 'https://github.com/radareorg/r0',
'versions': [{'id': 'git', 'packages': {}}]
},
'radare2': {
'source': 'https://github.com/radareorg/radare2',
'versions': radare2_versions[::-1]
}
}
if not os.path.isdir(r2env_path):
os.makedirs(r2env_path)
with open(os.path.join(r2env_path, 'profiles.json'), 'w', encoding='utf-8') as f:
json.dump(profiles, f)
def install_package(self, profile, version, use_meson, use_dist):
log_path = os.path.join(self._r2env_path, self.LOG_DIR)
timestamp = round(time.monotonic() * 1000)
@@ -57,11 +156,17 @@ class PackageManager:
os.makedirs(source_path)
if not os.path.isdir(dst_dir):
os.makedirs(dst_dir)
self._exit_if_package_not_available(profile, version)
if self._if_package_not_available(profile, version):
if os.path.isdir(dst_dir):
shutil.rmtree(dst_dir)
raise PackageManagerException(
f"{profile}@{version} package not available. Use 'list' command to see available packages.")
if use_dist:
if self._install_from_dist(profile, version):
print_console(f"[*] Binary package {profile}@{version} installed successfully")
else:
if os.path.isdir(dst_dir):
shutil.rmtree(dst_dir)
raise PackageManagerException(f"[x] Failed to install {profile}@{version}.")
else:
if self._build_from_source(profile, version, source_path, dst_dir, logfile, use_meson=use_meson):
@@ -93,11 +198,12 @@ class PackageManager:
raise PackageManagerException(f"[x] Unable to find installed package {package_name}")
def _get_pkgname(self, profile, version, cos):
for pkgv in self._packages[profile]["versions"]:
if pkgv["id"] == version:
for pkgd in pkgv["packages"].keys():
if pkgd == cos:
return pkgv["packages"][pkgd]
if profile in self._packages:
for pkgv in self._packages[profile]["versions"]:
if pkgv["id"] == version:
for pkgd in pkgv["packages"].keys():
if pkgd == cos:
return pkgv["packages"][pkgd]
return None
def _get_disturl(self, profile, version, cos):
@@ -190,7 +296,7 @@ class PackageManager:
@staticmethod
def _build_using_acr(source_path, dst_path, logfile, r2env_path):
"""Only works in Unix systems"""
if host_distname() in "w64":
if host_distname() is not None and host_distname() in "w64":
raise PackageManagerException("acr is not supported on Windows platform. Use meson instead.")
exit_if_not_exists(['make'])
print_console("[-] Building package using acr...")
@@ -222,12 +328,9 @@ class PackageManager:
print_console(f"Executing {cmd}")
return os.system(cmd) == 0
def _exit_if_package_not_available(self, profile, version):
pkg_found = False
for available_version in self._packages[profile]["versions"]:
if available_version['id'] == version:
pkg_found = True
break
if not pkg_found:
raise PackageManagerException(
f"{profile}@{version} package not available. Use 'list' command to see available packages.")
def _if_package_not_available(self, profile, version):
if profile in self._packages:
for available_version in self._packages[profile]["versions"]:
if available_version['id'] == version:
return False
return True
+2
View File
@@ -31,6 +31,7 @@ class REPL:
list - list all packages available to r2env.
shell - enter a new shell with PATH env var set.
purge - remove ~/.r2env
update - update list of available profiles
Environment
@@ -55,6 +56,7 @@ class REPL:
"install": self._core.install,
"installed": self._core.list_installed_packages,
"uninstall": self._core.uninstall,
"update": self._core.update_version_profiles,
"rm": self._core.uninstall,
"use": self._core.use,
"purge": self._core.purge,
+6 -1
View File
@@ -81,7 +81,12 @@ def git_fetch(url, version, source_path):
f"Verify the source path is not dirty. Error: {err}") \
from err
if version != "git":
repo.git.checkout(version)
try:
repo.git.checkout(version)
except git.GitCommandError:
# try again after pulling new tags from origin
repo.git.fetch("origin", "--tags")
repo.git.checkout(version)
sms = repo.submodules
for sm in sms:
if not sm.module_exists():
+1 -1
View File
@@ -1 +1 @@
0.5.6
0.5.9
+1
View File
@@ -1,4 +1,5 @@
dploy>=0.1.2
colorama>=0.4.4
wget
requests
GitPython
+1
View File
@@ -35,6 +35,7 @@ install_requires=
dploy >= 0.1.2
colorama >= 0.4.4
GitPython
requests
setup_requires =
setuptools_scm >= 1.15
include_package_data = True
+1 -1
View File
@@ -6,7 +6,7 @@ setup(
setup_requires=['pbr'],
pbr=True,
package_files=[
('config', ['r2env/config/config.json', 'r2env/config/profiles.json']),
('config', ['r2env/config/config.json']),
('', ['version.txt'])
]
)
+2 -1
View File
@@ -3,10 +3,11 @@ envlist = py{38,39,310}-{tests},{py38,py39,310}-codecheck-{pylint,flake8,bandit}
skipsdist = True
[testenv]
allowlist_externals = bash
deps = -r {toxinidir}/requirements/test.txt
passenv = *
commands =
py{38,39,310}-tests: {toxinidir}/run_tests.sh unit
py{38,39,310}-tests: bash {toxinidir}/run_tests.sh unit
py{38,39,310}-codecheck-pylint: pylint r2env
py{38,39,310}-codecheck-flake8: flake8 r2env
py{38,39,310}-codecheck-bandit: bandit -c .bandit.yml -r r2env