evolver-tools 12.0.0__tar.gz → 13.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {evolver_tools-12.0.0/src/evolver_tools.egg-info → evolver_tools-13.0.0}/PKG-INFO +2 -2
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/pyproject.toml +2 -2
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/cli.py +1 -1
- evolver_tools-13.0.0/src/evolver_tools/vendor/calendar_cli.py +45 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/cert_info.py +95 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/cron_pretty.py +128 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/disk_cleanup.py +107 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/docker_helper.py +74 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/geo_ip.py +71 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/hex_tool.py +59 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/macrogen.py +113 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/markdown_preview.py +100 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/network_scan.py +81 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/pipe_viewer.py +77 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/replace_text.py +73 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/search_files.py +101 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/system_info.py +132 -0
- evolver_tools-13.0.0/src/evolver_tools/vendor/temp_cleaner.py +99 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0/src/evolver_tools.egg-info}/PKG-INFO +2 -2
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools.egg-info/SOURCES.txt +15 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/LICENSE +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/README.md +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/setup.cfg +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/autoreg.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/backup.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/banner.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/join.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/joke.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/morse.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/restore.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/split.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
- {evolver_tools-12.0.0 → evolver_tools-13.0.0}/src/evolver_tools.egg-info/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evolver-tools
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 13.0.0
|
|
4
|
+
Summary: 144 CLI tools + 9 flagship projects — one pip install
|
|
5
5
|
Author: EVOLVER
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://evolver-dev.github.io/evolver-tools
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "evolver-tools"
|
|
7
|
-
version = "
|
|
8
|
-
description = "
|
|
7
|
+
version = "13.0.0"
|
|
8
|
+
description = "144 CLI tools + 9 flagship projects — one pip install"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
11
11
|
requires-python = ">=3.8"
|
|
@@ -14,7 +14,7 @@ from evolver_tools.autoreg import auto_discover
|
|
|
14
14
|
def list_tools():
|
|
15
15
|
"""Display all available tools."""
|
|
16
16
|
tools = auto_discover()
|
|
17
|
-
print(f'\x1b[1;36m===== EVOLVER Tools
|
|
17
|
+
print(f'\x1b[1;36m===== EVOLVER Tools v13.0.0 =====\x1b[0m')
|
|
18
18
|
print()
|
|
19
19
|
for name, info in sorted(tools.items()):
|
|
20
20
|
print(f' \033[1;33m{name:<18}\033[0m {info["desc"]}')
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""calendar-cli — Display a terminal calendar."""
|
|
3
|
+
import calendar
|
|
4
|
+
import sys
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
|
|
7
|
+
TOOL_META = {
|
|
8
|
+
"name": "calendar-cli",
|
|
9
|
+
"func": "main",
|
|
10
|
+
"desc": "Display terminal calendar. Usage: calendar-cli [year] [month]",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
def main():
|
|
14
|
+
args = sys.argv[1:]
|
|
15
|
+
now = datetime.now()
|
|
16
|
+
year = now.year
|
|
17
|
+
month = now.month
|
|
18
|
+
if len(args) >= 2:
|
|
19
|
+
try:
|
|
20
|
+
year = int(args[0])
|
|
21
|
+
month = int(args[1])
|
|
22
|
+
except ValueError:
|
|
23
|
+
print("Usage: calendar-cli [year] [month]", file=sys.stderr)
|
|
24
|
+
sys.exit(1)
|
|
25
|
+
elif len(args) >= 1:
|
|
26
|
+
try:
|
|
27
|
+
year = int(args[0])
|
|
28
|
+
month = None
|
|
29
|
+
except ValueError:
|
|
30
|
+
print("Usage: calendar-cli [year] [month]", file=sys.stderr)
|
|
31
|
+
sys.exit(1)
|
|
32
|
+
cal = calendar.TextCalendar()
|
|
33
|
+
if month:
|
|
34
|
+
cal_str = cal.formatmonth(year, month)
|
|
35
|
+
# Highlight today
|
|
36
|
+
if year == now.year and month == now.month:
|
|
37
|
+
today = str(now.day)
|
|
38
|
+
cal_str = cal_str.replace(f" {today} ", f"[{today}]")
|
|
39
|
+
cal_str = cal_str.replace(f"{today} ", f"[{today}]")
|
|
40
|
+
print(cal_str)
|
|
41
|
+
else:
|
|
42
|
+
print(cal.formatyear(year))
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
main()
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""cert-info — Display SSL certificate details for a domain."""
|
|
3
|
+
import ssl
|
|
4
|
+
import socket
|
|
5
|
+
import sys
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
|
|
8
|
+
TOOL_META = {
|
|
9
|
+
"name": "cert-info",
|
|
10
|
+
"func": "main",
|
|
11
|
+
"desc": "Show SSL certificate info for a domain. Usage: cert-info <domain> [port]",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def main():
|
|
15
|
+
args = sys.argv[1:]
|
|
16
|
+
if not args or args[0] in ("-h", "--help"):
|
|
17
|
+
print("Usage: cert-info <domain> [port]", file=sys.stderr)
|
|
18
|
+
print(" Default port: 443", file=sys.stderr)
|
|
19
|
+
sys.exit(1)
|
|
20
|
+
host = args[0]
|
|
21
|
+
port = int(args[1]) if len(args) > 1 else 443
|
|
22
|
+
try:
|
|
23
|
+
ctx = ssl.create_default_context()
|
|
24
|
+
with socket.create_connection((host, port), timeout=10) as sock:
|
|
25
|
+
with ctx.wrap_socket(sock, server_hostname=host) as ssock:
|
|
26
|
+
cert = ssock.getpeercert()
|
|
27
|
+
if not cert:
|
|
28
|
+
print(f"No certificate returned by {host}:{port}", file=sys.stderr)
|
|
29
|
+
sys.exit(1)
|
|
30
|
+
print(f"SSL Certificate for {host}:{port}")
|
|
31
|
+
print("=" * 50)
|
|
32
|
+
# Subject
|
|
33
|
+
subject = dict(x[0] for x in cert.get("subject", []))
|
|
34
|
+
print(f"Subject:")
|
|
35
|
+
for key, val in subject.items():
|
|
36
|
+
print(f" {key}: {val}")
|
|
37
|
+
# Issuer
|
|
38
|
+
issuer = dict(x[0] for x in cert.get("issuer", []))
|
|
39
|
+
print(f"Issuer:")
|
|
40
|
+
for key, val in issuer.items():
|
|
41
|
+
print(f" {key}: {val}")
|
|
42
|
+
# Validity
|
|
43
|
+
print(f"Valid from: {cert.get('notBefore', 'N/A')}")
|
|
44
|
+
print(f"Valid until: {cert.get('notAfter', 'N/A')}")
|
|
45
|
+
# Check expiry
|
|
46
|
+
try:
|
|
47
|
+
not_after = cert.get("notAfter", "")
|
|
48
|
+
expiry = datetime.strptime(not_after, "%b %d %H:%M:%S %Y %Z")
|
|
49
|
+
now = datetime.utcnow()
|
|
50
|
+
remaining = (expiry - now).days
|
|
51
|
+
if remaining < 0:
|
|
52
|
+
print(f"⚠ EXPIRED {abs(remaining)} days ago!")
|
|
53
|
+
elif remaining < 30:
|
|
54
|
+
print(f"⚠ Expires in {remaining} days (soon!)")
|
|
55
|
+
else:
|
|
56
|
+
print(f"✓ Expires in {remaining} days")
|
|
57
|
+
except Exception:
|
|
58
|
+
pass
|
|
59
|
+
# SAN
|
|
60
|
+
san = cert.get("subjectAltName", [])
|
|
61
|
+
if san:
|
|
62
|
+
print(f"Subject Alt Names ({len(san)}):")
|
|
63
|
+
for _, name in san[:10]:
|
|
64
|
+
print(f" {name}")
|
|
65
|
+
if len(san) > 10:
|
|
66
|
+
print(f" ... and {len(san) - 10} more")
|
|
67
|
+
# Serial
|
|
68
|
+
serial = cert.get("serialNumber", "")
|
|
69
|
+
if serial:
|
|
70
|
+
print(f"Serial: {serial}")
|
|
71
|
+
# Version
|
|
72
|
+
print(f"Version: {cert.get('version', 'N/A')}")
|
|
73
|
+
# Fingerprints
|
|
74
|
+
try:
|
|
75
|
+
der = ssock.getpeercert(binary_form=True)
|
|
76
|
+
import hashlib
|
|
77
|
+
print(f"SHA256: {hashlib.sha256(der).hexdigest()}")
|
|
78
|
+
print(f"SHA1: {hashlib.sha1(der).hexdigest()}")
|
|
79
|
+
except Exception:
|
|
80
|
+
pass
|
|
81
|
+
except ssl.SSLError as e:
|
|
82
|
+
print(f"SSL Error: {e}", file=sys.stderr)
|
|
83
|
+
sys.exit(1)
|
|
84
|
+
except socket.gaierror:
|
|
85
|
+
print(f"Could not resolve: {host}", file=sys.stderr)
|
|
86
|
+
sys.exit(1)
|
|
87
|
+
except socket.timeout:
|
|
88
|
+
print(f"Connection timed out: {host}:{port}", file=sys.stderr)
|
|
89
|
+
sys.exit(1)
|
|
90
|
+
except Exception as e:
|
|
91
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
92
|
+
sys.exit(1)
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
main()
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""cron-pretty — Pretty-print cron expressions in human-readable format."""
|
|
3
|
+
import re
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
TOOL_META = {
|
|
7
|
+
"name": "cron-pretty",
|
|
8
|
+
"func": "main",
|
|
9
|
+
"desc": "Describe cron schedule in plain English. Usage: cron-pretty '*/5 * * * *'",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
WEEKDAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
|
13
|
+
MONTHS = [None, "January", "February", "March", "April", "May", "June",
|
|
14
|
+
"July", "August", "September", "October", "November", "December"]
|
|
15
|
+
|
|
16
|
+
def describe(minute, hour, dom, month, dow):
|
|
17
|
+
parts = []
|
|
18
|
+
# Minute
|
|
19
|
+
if minute == "*":
|
|
20
|
+
min_desc = "every minute"
|
|
21
|
+
elif re.match(r"^\d+$", minute):
|
|
22
|
+
min_desc = f"at minute {minute}"
|
|
23
|
+
elif minute.startswith("*/"):
|
|
24
|
+
step = minute[2:]
|
|
25
|
+
min_desc = f"every {step} minutes"
|
|
26
|
+
else:
|
|
27
|
+
min_desc = f"minute {minute}"
|
|
28
|
+
parts.append(min_desc)
|
|
29
|
+
# Hour
|
|
30
|
+
if hour == "*":
|
|
31
|
+
hour_desc = "of every hour"
|
|
32
|
+
elif re.match(r"^\d+$", hour):
|
|
33
|
+
hour_desc = f"past hour {hour}"
|
|
34
|
+
elif hour.startswith("*/"):
|
|
35
|
+
step = hour[2:]
|
|
36
|
+
hour_desc = f"every {step} hours"
|
|
37
|
+
else:
|
|
38
|
+
hour_desc = f"hour {hour}"
|
|
39
|
+
parts.append(hour_desc)
|
|
40
|
+
# Day of month
|
|
41
|
+
if dom == "*":
|
|
42
|
+
dom_desc = "every day"
|
|
43
|
+
elif dom.startswith("*/"):
|
|
44
|
+
step = dom[2:]
|
|
45
|
+
dom_desc = f"every {step} days"
|
|
46
|
+
elif "," in dom:
|
|
47
|
+
days = dom.split(",")
|
|
48
|
+
dom_desc = f"on days {', '.join(days)}"
|
|
49
|
+
else:
|
|
50
|
+
dom_desc = f"on day {dom}"
|
|
51
|
+
parts.append(dom_desc)
|
|
52
|
+
# Month
|
|
53
|
+
if month == "*":
|
|
54
|
+
month_desc = "of every month"
|
|
55
|
+
elif re.match(r"^\d+$", month):
|
|
56
|
+
m = int(month)
|
|
57
|
+
month_desc = f"in {MONTHS[m] if m <= 12 else month}"
|
|
58
|
+
elif month.startswith("*/"):
|
|
59
|
+
step = month[2:]
|
|
60
|
+
month_desc = f"every {step} months"
|
|
61
|
+
else:
|
|
62
|
+
month_desc = f"in month {month}"
|
|
63
|
+
parts.append(month_desc)
|
|
64
|
+
# Day of week
|
|
65
|
+
if dow == "*":
|
|
66
|
+
dow_desc = ""
|
|
67
|
+
elif re.match(r"^\d+$", dow):
|
|
68
|
+
d = int(dow)
|
|
69
|
+
dow_desc = f"on {WEEKDAYS[d]}"
|
|
70
|
+
elif "," in dow:
|
|
71
|
+
days = [WEEKDAYS[int(d)] if d.isdigit() else d for d in dow.split(",")]
|
|
72
|
+
dow_desc = f"on {', '.join(days)}"
|
|
73
|
+
else:
|
|
74
|
+
dow_desc = f"on {dow}"
|
|
75
|
+
if dow_desc:
|
|
76
|
+
parts.append(dow_desc)
|
|
77
|
+
# Special cases
|
|
78
|
+
if minute == "0" and hour == "0" and dom == "*" and month == "*" and dow == "*":
|
|
79
|
+
return "At midnight, every day"
|
|
80
|
+
if minute == "0" and hour == "12" and dom == "*" and month == "*" and dow == "*":
|
|
81
|
+
return "At noon, every day"
|
|
82
|
+
if minute == "0" and hour in ("0", "12") and dom == "1" and month == "*" and dow == "*":
|
|
83
|
+
return f"At {hour}:00 AM, on the 1st of every month"
|
|
84
|
+
if minute == "0" and hour == "9" and dom == "*" and month == "*" and dow in ("1", "1-5"):
|
|
85
|
+
return "At 9:00 AM, Monday through Friday"
|
|
86
|
+
if minute == "30" and hour == "9" and dom == "*" and month == "*" and dow in ("1", "1-5"):
|
|
87
|
+
return "At 9:30 AM, Monday through Friday"
|
|
88
|
+
# Build description
|
|
89
|
+
result = f"{parts[0]} {parts[1]} {parts[2]} {parts[3]}"
|
|
90
|
+
if len(parts) > 4:
|
|
91
|
+
result += f" {parts[4]}"
|
|
92
|
+
return result
|
|
93
|
+
|
|
94
|
+
def main():
|
|
95
|
+
args = sys.argv[1:]
|
|
96
|
+
if not args or args[0] in ("-h", "--help"):
|
|
97
|
+
print("Usage: cron-pretty '*/5 * * * *'", file=sys.stderr)
|
|
98
|
+
print(" cron-pretty '30 9 * * 1-5'", file=sys.stderr)
|
|
99
|
+
sys.exit(1)
|
|
100
|
+
expr = args[0].strip()
|
|
101
|
+
fields = expr.split()
|
|
102
|
+
# Handle special strings
|
|
103
|
+
special = {
|
|
104
|
+
"@yearly": "0 0 1 1 *",
|
|
105
|
+
"@annually": "0 0 1 1 *",
|
|
106
|
+
"@monthly": "0 0 1 * *",
|
|
107
|
+
"@weekly": "0 0 * * 0",
|
|
108
|
+
"@daily": "0 0 * * *",
|
|
109
|
+
"@hourly": "0 * * * *",
|
|
110
|
+
"@reboot": None,
|
|
111
|
+
}
|
|
112
|
+
if expr in special:
|
|
113
|
+
resolved = special[expr]
|
|
114
|
+
if resolved is None:
|
|
115
|
+
print(f"'{expr}' — runs at system startup/reboot")
|
|
116
|
+
return
|
|
117
|
+
fields = resolved.split()
|
|
118
|
+
if len(fields) != 5:
|
|
119
|
+
print(f"Invalid cron expression: '{expr}'", file=sys.stderr)
|
|
120
|
+
print("Expected format: minute hour day-of-month month day-of-week", file=sys.stderr)
|
|
121
|
+
sys.exit(1)
|
|
122
|
+
minute, hour, dom, month, dow = fields
|
|
123
|
+
description = describe(minute, hour, dom, month, dow)
|
|
124
|
+
print(f" {expr}")
|
|
125
|
+
print(f" → {description}")
|
|
126
|
+
|
|
127
|
+
if __name__ == "__main__":
|
|
128
|
+
main()
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""disk-cleanup — Analyze disk usage and suggest cleanup actions."""
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
TOOL_META = {
|
|
7
|
+
"name": "disk-cleanup",
|
|
8
|
+
"func": "main",
|
|
9
|
+
"desc": "Analyze disk usage and suggest cleanup. Usage: disk-cleanup [path] [--deep]",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
COMMON_CLEANUP = [
|
|
13
|
+
("~/.cache", "Cache files"),
|
|
14
|
+
("~/.local/share/Trash", "Trash"),
|
|
15
|
+
("/tmp", "Temp files"),
|
|
16
|
+
("~/.npm/_cacache", "npm cache"),
|
|
17
|
+
("~/.rustup/tmp", "rustup temp"),
|
|
18
|
+
("~/.cargo/registry/cache", "Cargo cache"),
|
|
19
|
+
("~/.gradle/caches", "Gradle cache"),
|
|
20
|
+
("~/.m2/repository", "Maven cache"),
|
|
21
|
+
("~/.local/share/pip/cache", "pip cache"),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
def get_size(path):
|
|
25
|
+
try:
|
|
26
|
+
if os.path.isfile(path):
|
|
27
|
+
return os.path.getsize(path)
|
|
28
|
+
total = 0
|
|
29
|
+
for root, dirs, files in os.walk(path):
|
|
30
|
+
for f in files:
|
|
31
|
+
try:
|
|
32
|
+
total += os.path.getsize(os.path.join(root, f))
|
|
33
|
+
except Exception:
|
|
34
|
+
pass
|
|
35
|
+
return total
|
|
36
|
+
except Exception:
|
|
37
|
+
return 0
|
|
38
|
+
|
|
39
|
+
def format_size(size):
|
|
40
|
+
for unit in ["B", "KB", "MB", "GB"]:
|
|
41
|
+
if size < 1024:
|
|
42
|
+
return f"{size:.1f} {unit}"
|
|
43
|
+
size /= 1024
|
|
44
|
+
return f"{size:.1f} TB"
|
|
45
|
+
|
|
46
|
+
def find_large_files(path, limit=20, min_mb=50):
|
|
47
|
+
large = []
|
|
48
|
+
for root, dirs, files in os.walk(path):
|
|
49
|
+
dirs[:] = [d for d in dirs if not d.startswith(".") or d == "."]
|
|
50
|
+
for f in files:
|
|
51
|
+
try:
|
|
52
|
+
fp = os.path.join(root, f)
|
|
53
|
+
size = os.path.getsize(fp)
|
|
54
|
+
if size >= min_mb * 1024 * 1024:
|
|
55
|
+
large.append((fp, size))
|
|
56
|
+
except Exception:
|
|
57
|
+
pass
|
|
58
|
+
large.sort(key=lambda x: -x[1])
|
|
59
|
+
return large[:limit]
|
|
60
|
+
|
|
61
|
+
def main():
|
|
62
|
+
args = sys.argv[1:]
|
|
63
|
+
root_path = args[0] if args and not args[0].startswith("-") else os.path.expanduser("~")
|
|
64
|
+
deep = "--deep" in args
|
|
65
|
+
root_path = os.path.abspath(root_path)
|
|
66
|
+
print(f"Disk Cleanup Analysis: {root_path}")
|
|
67
|
+
print("=" * 50)
|
|
68
|
+
# Check common cleanup locations
|
|
69
|
+
print("\nCommon cleanup locations:")
|
|
70
|
+
any_found = False
|
|
71
|
+
for rel_path, label in COMMON_CLEANUP:
|
|
72
|
+
path = os.path.expanduser(rel_path)
|
|
73
|
+
if os.path.exists(path):
|
|
74
|
+
size = get_size(path)
|
|
75
|
+
if size > 0:
|
|
76
|
+
any_found = True
|
|
77
|
+
print(f" {format_size(size):>8} {label} ({path})")
|
|
78
|
+
if not any_found:
|
|
79
|
+
print(" (none found)")
|
|
80
|
+
# Check directory sizes if root path is a directory
|
|
81
|
+
if os.path.isdir(root_path):
|
|
82
|
+
print(f"\nLargest directories in {root_path}:")
|
|
83
|
+
dirs = []
|
|
84
|
+
for entry in os.listdir(root_path):
|
|
85
|
+
full = os.path.join(root_path, entry)
|
|
86
|
+
if os.path.isdir(full):
|
|
87
|
+
size = get_size(full)
|
|
88
|
+
dirs.append((entry, size))
|
|
89
|
+
dirs.sort(key=lambda x: -x[1])
|
|
90
|
+
for name, size in dirs[:10]:
|
|
91
|
+
if size > 1024 * 1024: # > 1MB
|
|
92
|
+
print(f" {format_size(size):>8} {name}")
|
|
93
|
+
if deep:
|
|
94
|
+
print(f"\nLargest files (>50MB):")
|
|
95
|
+
large = find_large_files(root_path)
|
|
96
|
+
if large:
|
|
97
|
+
for fp, size in large:
|
|
98
|
+
rel = os.path.relpath(fp, os.path.expanduser("~"))
|
|
99
|
+
print(f" {format_size(size):>8} ~/{rel}")
|
|
100
|
+
else:
|
|
101
|
+
print(" (none found)")
|
|
102
|
+
print("\nSuggestions:")
|
|
103
|
+
print(" temp-cleaner --dry-run Preview temp file cleanup")
|
|
104
|
+
print(" disk-usage Show disk usage summary")
|
|
105
|
+
|
|
106
|
+
if __name__ == "__main__":
|
|
107
|
+
main()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""docker-helper — Common Docker commands helper."""
|
|
3
|
+
import subprocess
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
TOOL_META = {
|
|
7
|
+
"name": "docker-helper",
|
|
8
|
+
"func": "main",
|
|
9
|
+
"desc": "Docker command helper. Usage: docker-helper <command> [args]",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
COMMANDS = {
|
|
13
|
+
"ps": "docker ps",
|
|
14
|
+
"images": "docker images",
|
|
15
|
+
"stats": "docker stats --no-stream",
|
|
16
|
+
"logs": "docker logs",
|
|
17
|
+
"stop-all": "docker stop $(docker ps -q)",
|
|
18
|
+
"rm-all": "docker rm $(docker ps -aq)",
|
|
19
|
+
"rmi-none": "docker rmi $(docker images -f dangling=true -q)",
|
|
20
|
+
"prune": "docker system prune -f",
|
|
21
|
+
"prune-all": "docker system prune -af --volumes",
|
|
22
|
+
"compose-ps": "docker compose ps",
|
|
23
|
+
"top": "docker top",
|
|
24
|
+
"inspect": "docker inspect",
|
|
25
|
+
"network-ls": "docker network ls",
|
|
26
|
+
"volume-ls": "docker volume ls",
|
|
27
|
+
"clean": "docker system prune -f",
|
|
28
|
+
"exec": "docker exec -it",
|
|
29
|
+
"build": "docker build",
|
|
30
|
+
"pull": "docker pull",
|
|
31
|
+
"push": "docker push",
|
|
32
|
+
"info": "docker info",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
def main():
|
|
36
|
+
args = sys.argv[1:]
|
|
37
|
+
if not args or args[0] in ("-h", "--help"):
|
|
38
|
+
print("Usage: docker-helper <command> [extra args...]")
|
|
39
|
+
print("\nAvailable commands:")
|
|
40
|
+
for cmd, desc in sorted(COMMANDS.items()):
|
|
41
|
+
print(f" {cmd:<15} {desc}")
|
|
42
|
+
print()
|
|
43
|
+
print("Examples:")
|
|
44
|
+
print(" docker-helper ps")
|
|
45
|
+
print(" docker-helper logs mycontainer")
|
|
46
|
+
print(" docker-helper stop-all")
|
|
47
|
+
return
|
|
48
|
+
cmd = args[0]
|
|
49
|
+
if cmd not in COMMANDS:
|
|
50
|
+
print(f"Unknown command: {cmd}", file=sys.stderr)
|
|
51
|
+
print("Available: " + ", ".join(sorted(COMMANDS.keys())), file=sys.stderr)
|
|
52
|
+
sys.exit(1)
|
|
53
|
+
docker_cmd = COMMANDS[cmd]
|
|
54
|
+
extra = args[1:]
|
|
55
|
+
full_cmd = docker_cmd + " " + " ".join(extra) if extra else docker_cmd
|
|
56
|
+
# Handle docker exec -it specially (needs pty, just show the command)
|
|
57
|
+
if cmd == "exec":
|
|
58
|
+
print(f"Run: {full_cmd}")
|
|
59
|
+
print("Note: Use 'docker exec -it' directly for interactive sessions")
|
|
60
|
+
return
|
|
61
|
+
print(f"$ {full_cmd}")
|
|
62
|
+
try:
|
|
63
|
+
result = subprocess.run(full_cmd, shell=True, capture_output=False, timeout=60)
|
|
64
|
+
if result.returncode != 0:
|
|
65
|
+
sys.exit(result.returncode)
|
|
66
|
+
except subprocess.TimeoutExpired:
|
|
67
|
+
print("Command timed out", file=sys.stderr)
|
|
68
|
+
sys.exit(1)
|
|
69
|
+
except FileNotFoundError:
|
|
70
|
+
print("Docker not found. Is Docker installed?", file=sys.stderr)
|
|
71
|
+
sys.exit(1)
|
|
72
|
+
|
|
73
|
+
if __name__ == "__main__":
|
|
74
|
+
main()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""geo-ip — Look up geolocation for an IP address."""
|
|
3
|
+
import json
|
|
4
|
+
import sys
|
|
5
|
+
import urllib.request
|
|
6
|
+
|
|
7
|
+
TOOL_META = {
|
|
8
|
+
"name": "geo-ip",
|
|
9
|
+
"func": "main",
|
|
10
|
+
"desc": "Look up IP geolocation. Usage: geo-ip [IP address]",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
SERVICES = [
|
|
14
|
+
("https://ipinfo.io/{}/json", lambda d: {
|
|
15
|
+
"ip": d.get("ip"),
|
|
16
|
+
"city": d.get("city"),
|
|
17
|
+
"region": d.get("region"),
|
|
18
|
+
"country": d.get("country"),
|
|
19
|
+
"loc": d.get("loc"),
|
|
20
|
+
"org": d.get("org"),
|
|
21
|
+
"timezone": d.get("timezone"),
|
|
22
|
+
}),
|
|
23
|
+
("https://ip-api.com/json/{}", lambda d: {
|
|
24
|
+
"ip": d.get("query"),
|
|
25
|
+
"city": d.get("city"),
|
|
26
|
+
"region": d.get("regionName"),
|
|
27
|
+
"country": d.get("country"),
|
|
28
|
+
"lat": d.get("lat"),
|
|
29
|
+
"lon": d.get("lon"),
|
|
30
|
+
"org": d.get("isp"),
|
|
31
|
+
"timezone": d.get("timezone"),
|
|
32
|
+
}),
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
def lookup_ip(ip_addr):
|
|
36
|
+
"""Look up IP address geolocation."""
|
|
37
|
+
for url_template, parser in SERVICES:
|
|
38
|
+
url = url_template.format(ip_addr)
|
|
39
|
+
try:
|
|
40
|
+
req = urllib.request.Request(url, headers={"User-Agent": "evolver-tools/12.0"})
|
|
41
|
+
with urllib.request.urlopen(req, timeout=10) as resp:
|
|
42
|
+
data = json.loads(resp.read())
|
|
43
|
+
result = parser(data)
|
|
44
|
+
if result.get("ip"):
|
|
45
|
+
return result
|
|
46
|
+
except Exception:
|
|
47
|
+
continue
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
def main():
|
|
51
|
+
args = sys.argv[1:]
|
|
52
|
+
ip = args[0] if args else "me"
|
|
53
|
+
result = lookup_ip(ip)
|
|
54
|
+
if not result:
|
|
55
|
+
print(f"Could not look up: {ip}", file=sys.stderr)
|
|
56
|
+
sys.exit(1)
|
|
57
|
+
print(f"IP Address: {result.get('ip', 'N/A')}")
|
|
58
|
+
print(f"City: {result.get('city', 'N/A')}")
|
|
59
|
+
print(f"Region: {result.get('region', 'N/A')}")
|
|
60
|
+
print(f"Country: {result.get('country', 'N/A')}")
|
|
61
|
+
if result.get("loc"):
|
|
62
|
+
print(f"Location: {result['loc']}")
|
|
63
|
+
if result.get("lat") and result.get("lon"):
|
|
64
|
+
print(f"Coordinates: {result['lat']}, {result['lon']}")
|
|
65
|
+
if result.get("org"):
|
|
66
|
+
print(f"ISP: {result['org']}")
|
|
67
|
+
if result.get("timezone"):
|
|
68
|
+
print(f"Timezone: {result['timezone']}")
|
|
69
|
+
|
|
70
|
+
if __name__ == "__main__":
|
|
71
|
+
main()
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""hex-tool — Hex encode/decode and conversion tool."""
|
|
3
|
+
import binascii
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
TOOL_META = {
|
|
7
|
+
"name": "hex-tool",
|
|
8
|
+
"func": "main",
|
|
9
|
+
"desc": "Hex encode/decode. Usage: hex-tool encode <text> | hex-tool decode <hex>",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
def encode(data):
|
|
13
|
+
return binascii.hexlify(data.encode()).decode()
|
|
14
|
+
|
|
15
|
+
def decode(hex_str):
|
|
16
|
+
try:
|
|
17
|
+
return binascii.unhexlify(hex_str.replace(" ", "").replace("\n", "")).decode()
|
|
18
|
+
except UnicodeDecodeError:
|
|
19
|
+
return str(binascii.unhexlify(hex_str.replace(" ", "")))
|
|
20
|
+
except binascii.Error as e:
|
|
21
|
+
return f"Error: {e}"
|
|
22
|
+
|
|
23
|
+
def main():
|
|
24
|
+
args = sys.argv[1:]
|
|
25
|
+
if len(args) < 2 or args[0] in ("-h", "--help"):
|
|
26
|
+
print("Usage:")
|
|
27
|
+
print(" hex-tool encode <text> Encode text to hex")
|
|
28
|
+
print(" hex-tool decode <hex> Decode hex to text")
|
|
29
|
+
print(" hex-tool dump <file> Hex dump a file")
|
|
30
|
+
print(" hex-tool Interactive mode")
|
|
31
|
+
return
|
|
32
|
+
cmd = args[0]
|
|
33
|
+
if cmd == "encode":
|
|
34
|
+
text = " ".join(args[1:])
|
|
35
|
+
print(encode(text))
|
|
36
|
+
elif cmd == "decode":
|
|
37
|
+
hex_str = " ".join(args[1:])
|
|
38
|
+
print(decode(hex_str))
|
|
39
|
+
elif cmd == "dump":
|
|
40
|
+
filepath = args[1]
|
|
41
|
+
try:
|
|
42
|
+
with open(filepath, "rb") as f:
|
|
43
|
+
data = f.read()
|
|
44
|
+
offset = 0
|
|
45
|
+
for i in range(0, len(data), 16):
|
|
46
|
+
chunk = data[i:i+16]
|
|
47
|
+
hex_part = " ".join(f"{b:02x}" for b in chunk)
|
|
48
|
+
ascii_part = "".join(chr(b) if 32 <= b < 127 else "." for b in chunk)
|
|
49
|
+
print(f"{offset:08x} {hex_part:<48} {ascii_part}")
|
|
50
|
+
offset += 16
|
|
51
|
+
except Exception as e:
|
|
52
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
53
|
+
sys.exit(1)
|
|
54
|
+
else:
|
|
55
|
+
print(f"Unknown command: {cmd}", file=sys.stderr)
|
|
56
|
+
sys.exit(1)
|
|
57
|
+
|
|
58
|
+
if __name__ == "__main__":
|
|
59
|
+
main()
|