moriarty-project 0.1.6__py3-none-any.whl
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.
- moriarty/__init__.py +5 -0
- moriarty/adapters/__init__.py +0 -0
- moriarty/agent/__init__.py +0 -0
- moriarty/assets/modules/.gitkeep +0 -0
- moriarty/assets/modules/asia/douban.yaml +19 -0
- moriarty/assets/modules/asia/kakao.yaml +19 -0
- moriarty/assets/modules/asia/line.yaml +19 -0
- moriarty/assets/modules/asia/mixi.yaml +19 -0
- moriarty/assets/modules/asia/naver.yaml +19 -0
- moriarty/assets/modules/asia/qq.yaml +19 -0
- moriarty/assets/modules/asia/vk.yaml +19 -0
- moriarty/assets/modules/asia/wechat.yaml +19 -0
- moriarty/assets/modules/asia/weibo.yaml +19 -0
- moriarty/assets/modules/asia/xiaohongshu.yaml +19 -0
- moriarty/assets/modules/behance.yaml +47 -0
- moriarty/assets/modules/business/crunchbase.yaml +27 -0
- moriarty/assets/modules/business/fiverr.yaml +32 -0
- moriarty/assets/modules/business/freelancer.yaml +27 -0
- moriarty/assets/modules/business/glassdoor.yaml +27 -0
- moriarty/assets/modules/business/guru.yaml +26 -0
- moriarty/assets/modules/business/indeed.yaml +25 -0
- moriarty/assets/modules/business/monster.yaml +25 -0
- moriarty/assets/modules/business/peopleperhour.yaml +26 -0
- moriarty/assets/modules/business/toptal.yaml +28 -0
- moriarty/assets/modules/business/upwork.yaml +27 -0
- moriarty/assets/modules/business/ziprecruiter.yaml +25 -0
- moriarty/assets/modules/content/buymeacoffee.yaml +27 -0
- moriarty/assets/modules/content/gumroad.yaml +27 -0
- moriarty/assets/modules/content/ko-fi.yaml +32 -0
- moriarty/assets/modules/content/onlyfans.yaml +27 -0
- moriarty/assets/modules/content/patreon.yaml +33 -0
- moriarty/assets/modules/content/substack.yaml +32 -0
- moriarty/assets/modules/creative/500px.yaml +31 -0
- moriarty/assets/modules/creative/artstation.yaml +33 -0
- moriarty/assets/modules/creative/deviantart.yaml +32 -0
- moriarty/assets/modules/creative/flickr.yaml +31 -0
- moriarty/assets/modules/creative/pexels.yaml +26 -0
- moriarty/assets/modules/creative/unsplash.yaml +26 -0
- moriarty/assets/modules/creative/vimeo.yaml +31 -0
- moriarty/assets/modules/crypto/binance.yaml +27 -0
- moriarty/assets/modules/crypto/bitcointalk.yaml +33 -0
- moriarty/assets/modules/crypto/coinbase.yaml +26 -0
- moriarty/assets/modules/crypto/etherscan.yaml +32 -0
- moriarty/assets/modules/crypto/foundation.yaml +28 -0
- moriarty/assets/modules/crypto/kraken.yaml +27 -0
- moriarty/assets/modules/crypto/mirror.yaml +27 -0
- moriarty/assets/modules/crypto/niftygateway.yaml +26 -0
- moriarty/assets/modules/crypto/opensea.yaml +32 -0
- moriarty/assets/modules/crypto/rarible.yaml +27 -0
- moriarty/assets/modules/crypto/superrare.yaml +29 -0
- moriarty/assets/modules/dating/bumble.yaml +25 -0
- moriarty/assets/modules/dating/grindr.yaml +27 -0
- moriarty/assets/modules/dating/happn.yaml +25 -0
- moriarty/assets/modules/dating/her.yaml +27 -0
- moriarty/assets/modules/dating/hinge.yaml +25 -0
- moriarty/assets/modules/dating/match.yaml +25 -0
- moriarty/assets/modules/dating/meetme.yaml +27 -0
- moriarty/assets/modules/dating/okcupid.yaml +25 -0
- moriarty/assets/modules/dating/pof.yaml +25 -0
- moriarty/assets/modules/dating/tinder.yaml +25 -0
- moriarty/assets/modules/dating-nsfw/adultfriendfinder.yaml +28 -0
- moriarty/assets/modules/dating-nsfw/ashley-madison.yaml +26 -0
- moriarty/assets/modules/design/adobe-portfolio.yaml +27 -0
- moriarty/assets/modules/design/carbonmade.yaml +27 -0
- moriarty/assets/modules/design/cgsociety.yaml +27 -0
- moriarty/assets/modules/design/coroflot.yaml +27 -0
- moriarty/assets/modules/design/figma.yaml +27 -0
- moriarty/assets/modules/design/sketch.yaml +26 -0
- moriarty/assets/modules/dev/bitbucket.yaml +35 -0
- moriarty/assets/modules/dev/codeforces.yaml +32 -0
- moriarty/assets/modules/dev/codepen.yaml +34 -0
- moriarty/assets/modules/dev/hackerone.yaml +32 -0
- moriarty/assets/modules/dev/hackthebox.yaml +27 -0
- moriarty/assets/modules/dev/huggingface.yaml +27 -0
- moriarty/assets/modules/dev/kaggle.yaml +32 -0
- moriarty/assets/modules/dev/leetcode.yaml +32 -0
- moriarty/assets/modules/dev/replit.yaml +31 -0
- moriarty/assets/modules/dribbble.yaml +53 -0
- moriarty/assets/modules/ecommerce/etsy.yaml +32 -0
- moriarty/assets/modules/education/duolingo.yaml +32 -0
- moriarty/assets/modules/education/edx.yaml +26 -0
- moriarty/assets/modules/education/khanacademy.yaml +26 -0
- moriarty/assets/modules/education/lynda.yaml +27 -0
- moriarty/assets/modules/education/memrise.yaml +27 -0
- moriarty/assets/modules/education/pluralsight.yaml +27 -0
- moriarty/assets/modules/education/skillshare.yaml +27 -0
- moriarty/assets/modules/education/udacity.yaml +27 -0
- moriarty/assets/modules/email/github_email.yaml +40 -0
- moriarty/assets/modules/email/gravatar.yaml +23 -0
- moriarty/assets/modules/europe/badoo.yaml +19 -0
- moriarty/assets/modules/europe/lovoo.yaml +19 -0
- moriarty/assets/modules/europe/myspace.yaml +19 -0
- moriarty/assets/modules/europe/netlog.yaml +19 -0
- moriarty/assets/modules/europe/ok.yaml +19 -0
- moriarty/assets/modules/europe/skyrock.yaml +19 -0
- moriarty/assets/modules/europe/studivz.yaml +19 -0
- moriarty/assets/modules/europe/tuenti.yaml +19 -0
- moriarty/assets/modules/europe/viadeo.yaml +19 -0
- moriarty/assets/modules/europe/xing.yaml +19 -0
- moriarty/assets/modules/fitness/fitbit.yaml +27 -0
- moriarty/assets/modules/fitness/garmin.yaml +27 -0
- moriarty/assets/modules/fitness/myfitnesspal.yaml +27 -0
- moriarty/assets/modules/fitness/strava.yaml +33 -0
- moriarty/assets/modules/fitness/zwift.yaml +28 -0
- moriarty/assets/modules/food/allrecipes.yaml +27 -0
- moriarty/assets/modules/food/tasty.yaml +27 -0
- moriarty/assets/modules/food/yelp.yaml +32 -0
- moriarty/assets/modules/food/zomato.yaml +28 -0
- moriarty/assets/modules/forums/4chan.yaml +26 -0
- moriarty/assets/modules/forums/8kun.yaml +26 -0
- moriarty/assets/modules/forums/9gag.yaml +26 -0
- moriarty/assets/modules/forums/discourse.yaml +26 -0
- moriarty/assets/modules/forums/disqus.yaml +31 -0
- moriarty/assets/modules/forums/hackernews.yaml +32 -0
- moriarty/assets/modules/forums/launchpad.yaml +27 -0
- moriarty/assets/modules/forums/phpbb.yaml +25 -0
- moriarty/assets/modules/forums/quora.yaml +32 -0
- moriarty/assets/modules/forums/serverfault.yaml +27 -0
- moriarty/assets/modules/forums/slashdot.yaml +28 -0
- moriarty/assets/modules/forums/stackexchange.yaml +32 -0
- moriarty/assets/modules/forums/superuser.yaml +27 -0
- moriarty/assets/modules/forums/vbulletin.yaml +25 -0
- moriarty/assets/modules/forums/xenforo.yaml +25 -0
- moriarty/assets/modules/forums-nsfw/kiwifarms.yaml +25 -0
- moriarty/assets/modules/forums-nsfw/lolcow.yaml +26 -0
- moriarty/assets/modules/gaming/apextracker.yaml +27 -0
- moriarty/assets/modules/gaming/battlenet.yaml +26 -0
- moriarty/assets/modules/gaming/chess.yaml +30 -0
- moriarty/assets/modules/gaming/discord-public.yaml +27 -0
- moriarty/assets/modules/gaming/dotabuff.yaml +32 -0
- moriarty/assets/modules/gaming/epicgames.yaml +25 -0
- moriarty/assets/modules/gaming/faceit.yaml +33 -0
- moriarty/assets/modules/gaming/fortnitetracker.yaml +32 -0
- moriarty/assets/modules/gaming/gog.yaml +26 -0
- moriarty/assets/modules/gaming/itch.yaml +32 -0
- moriarty/assets/modules/gaming/kongregate.yaml +25 -0
- moriarty/assets/modules/gaming/minecraft.yaml +31 -0
- moriarty/assets/modules/gaming/opgg.yaml +32 -0
- moriarty/assets/modules/gaming/origin.yaml +26 -0
- moriarty/assets/modules/gaming/playstation.yaml +30 -0
- moriarty/assets/modules/gaming/roblox.yaml +31 -0
- moriarty/assets/modules/gaming/xbox.yaml +25 -0
- moriarty/assets/modules/github.yaml +68 -0
- moriarty/assets/modules/gitlab.yaml +60 -0
- moriarty/assets/modules/instagram.yaml +48 -0
- moriarty/assets/modules/latam/fotolog.yaml +27 -0
- moriarty/assets/modules/latam/orkut.yaml +26 -0
- moriarty/assets/modules/latam/taringa.yaml +27 -0
- moriarty/assets/modules/learning/coursera.yaml +26 -0
- moriarty/assets/modules/learning/udemy.yaml +26 -0
- moriarty/assets/modules/linkedin.yaml +40 -0
- moriarty/assets/modules/marketplaces/depop.yaml +28 -0
- moriarty/assets/modules/marketplaces/ebay.yaml +32 -0
- moriarty/assets/modules/marketplaces/grailed.yaml +27 -0
- moriarty/assets/modules/marketplaces/mercari.yaml +26 -0
- moriarty/assets/modules/marketplaces/poshmark.yaml +27 -0
- moriarty/assets/modules/marketplaces/reverb.yaml +27 -0
- moriarty/assets/modules/marketplaces/vinted.yaml +28 -0
- moriarty/assets/modules/medium.yaml +44 -0
- moriarty/assets/modules/music/audiomack.yaml +26 -0
- moriarty/assets/modules/music/bandcamp.yaml +30 -0
- moriarty/assets/modules/music/beatport.yaml +28 -0
- moriarty/assets/modules/music/deezer.yaml +26 -0
- moriarty/assets/modules/music/discogs.yaml +32 -0
- moriarty/assets/modules/music/genius.yaml +26 -0
- moriarty/assets/modules/music/lastfm.yaml +30 -0
- moriarty/assets/modules/music/mixcloud.yaml +26 -0
- moriarty/assets/modules/music/reverbnation.yaml +31 -0
- moriarty/assets/modules/music/soundcloud.yaml +31 -0
- moriarty/assets/modules/music/spotify.yaml +26 -0
- moriarty/assets/modules/music/tidal.yaml +26 -0
- moriarty/assets/modules/nsfw/adultwork.yaml +27 -0
- moriarty/assets/modules/nsfw/bongacams.yaml +28 -0
- moriarty/assets/modules/nsfw/cam4.yaml +28 -0
- moriarty/assets/modules/nsfw/chaturbate.yaml +28 -0
- moriarty/assets/modules/nsfw/clips4sale.yaml +27 -0
- moriarty/assets/modules/nsfw/extralunchmoney.yaml +27 -0
- moriarty/assets/modules/nsfw/fansly.yaml +28 -0
- moriarty/assets/modules/nsfw/fetlife.yaml +28 -0
- moriarty/assets/modules/nsfw/iwantclips.yaml +27 -0
- moriarty/assets/modules/nsfw/justforfans.yaml +28 -0
- moriarty/assets/modules/nsfw/loyalfans.yaml +28 -0
- moriarty/assets/modules/nsfw/manyvids.yaml +27 -0
- moriarty/assets/modules/nsfw/myfreecams.yaml +28 -0
- moriarty/assets/modules/nsfw/niteflirt.yaml +26 -0
- moriarty/assets/modules/nsfw/pornhub.yaml +32 -0
- moriarty/assets/modules/nsfw/redtube.yaml +27 -0
- moriarty/assets/modules/nsfw/stripchat.yaml +28 -0
- moriarty/assets/modules/nsfw/xhamster.yaml +27 -0
- moriarty/assets/modules/nsfw/xvideos.yaml +27 -0
- moriarty/assets/modules/nsfw/youporn.yaml +27 -0
- moriarty/assets/modules/photography/eyeem.yaml +25 -0
- moriarty/assets/modules/photography/fotki.yaml +25 -0
- moriarty/assets/modules/photography/photobucket.yaml +26 -0
- moriarty/assets/modules/photography/smugmug.yaml +25 -0
- moriarty/assets/modules/photography/vsco.yaml +27 -0
- moriarty/assets/modules/pinterest.yaml +40 -0
- moriarty/assets/modules/podcasts/anchor.yaml +26 -0
- moriarty/assets/modules/podcasts/castbox.yaml +26 -0
- moriarty/assets/modules/podcasts/podbean.yaml +26 -0
- moriarty/assets/modules/professional/about.yaml +31 -0
- moriarty/assets/modules/professional/academia.yaml +27 -0
- moriarty/assets/modules/professional/angellist.yaml +27 -0
- moriarty/assets/modules/professional/calendly.yaml +26 -0
- moriarty/assets/modules/professional/issuu.yaml +27 -0
- moriarty/assets/modules/professional/mendeley.yaml +27 -0
- moriarty/assets/modules/professional/notion.yaml +27 -0
- moriarty/assets/modules/professional/orcid.yaml +27 -0
- moriarty/assets/modules/professional/producthunt.yaml +31 -0
- moriarty/assets/modules/professional/researchgate.yaml +32 -0
- moriarty/assets/modules/professional/scribd.yaml +27 -0
- moriarty/assets/modules/professional/slideshare.yaml +31 -0
- moriarty/assets/modules/professional/trello.yaml +26 -0
- moriarty/assets/modules/professional/typeform.yaml +27 -0
- moriarty/assets/modules/reddit.yaml +46 -0
- moriarty/assets/modules/regional/amino.yaml +27 -0
- moriarty/assets/modules/regional/ask-fm.yaml +32 -0
- moriarty/assets/modules/regional/babycenter.yaml +26 -0
- moriarty/assets/modules/regional/cafemom.yaml +27 -0
- moriarty/assets/modules/regional/care2.yaml +27 -0
- moriarty/assets/modules/regional/diaspora.yaml +26 -0
- moriarty/assets/modules/regional/ello.yaml +27 -0
- moriarty/assets/modules/regional/gaia.yaml +27 -0
- moriarty/assets/modules/regional/habbo.yaml +27 -0
- moriarty/assets/modules/regional/imvu.yaml +27 -0
- moriarty/assets/modules/regional/lemmy.yaml +27 -0
- moriarty/assets/modules/regional/peertube.yaml +26 -0
- moriarty/assets/modules/regional/pixelfed.yaml +27 -0
- moriarty/assets/modules/regional/plurk.yaml +26 -0
- moriarty/assets/modules/regional/recroom.yaml +27 -0
- moriarty/assets/modules/regional/secondlife.yaml +26 -0
- moriarty/assets/modules/regional/vine-archive.yaml +27 -0
- moriarty/assets/modules/regional/vrchat.yaml +27 -0
- moriarty/assets/modules/regional/weheartit.yaml +27 -0
- moriarty/assets/modules/social/anilist.yaml +27 -0
- moriarty/assets/modules/social/beacons.yaml +26 -0
- moriarty/assets/modules/social/blogger.yaml +27 -0
- moriarty/assets/modules/social/crunchyroll.yaml +27 -0
- moriarty/assets/modules/social/discord.yaml +27 -0
- moriarty/assets/modules/social/dreamwidth.yaml +26 -0
- moriarty/assets/modules/social/facebook.yaml +34 -0
- moriarty/assets/modules/social/goodreads.yaml +32 -0
- moriarty/assets/modules/social/imdb.yaml +27 -0
- moriarty/assets/modules/social/kitsu.yaml +27 -0
- moriarty/assets/modules/social/letterboxd.yaml +32 -0
- moriarty/assets/modules/social/linktree.yaml +26 -0
- moriarty/assets/modules/social/livejournal.yaml +27 -0
- moriarty/assets/modules/social/mastodon.yaml +30 -0
- moriarty/assets/modules/social/minds.yaml +25 -0
- moriarty/assets/modules/social/myanimelist.yaml +32 -0
- moriarty/assets/modules/social/ravelry.yaml +27 -0
- moriarty/assets/modules/social/snapchat.yaml +25 -0
- moriarty/assets/modules/social/telegram.yaml +35 -0
- moriarty/assets/modules/social/tiktok.yaml +35 -0
- moriarty/assets/modules/social/trakt.yaml +28 -0
- moriarty/assets/modules/social/wattpad.yaml +32 -0
- moriarty/assets/modules/social/wordpress-com.yaml +26 -0
- moriarty/assets/modules/sports/espn.yaml +26 -0
- moriarty/assets/modules/sports/untappd.yaml +32 -0
- moriarty/assets/modules/stackoverflow.yaml +47 -0
- moriarty/assets/modules/steam.yaml +47 -0
- moriarty/assets/modules/streaming/caffeine.yaml +25 -0
- moriarty/assets/modules/streaming/dlive.yaml +27 -0
- moriarty/assets/modules/streaming/trovo.yaml +25 -0
- moriarty/assets/modules/travel/airbnb.yaml +26 -0
- moriarty/assets/modules/travel/booking.yaml +26 -0
- moriarty/assets/modules/travel/couchsurfing.yaml +27 -0
- moriarty/assets/modules/travel/tripadvisor.yaml +32 -0
- moriarty/assets/modules/tumblr.yaml +40 -0
- moriarty/assets/modules/twitch.yaml +48 -0
- moriarty/assets/modules/twitter.yaml +39 -0
- moriarty/assets/modules/youtube.yaml +42 -0
- moriarty/assets/templates/cves/CVE-2017-5638.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2018-7600.yaml +30 -0
- moriarty/assets/templates/cves/CVE-2019-11510.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2019-19781.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2020-14882.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2020-14883.yaml +29 -0
- moriarty/assets/templates/cves/CVE-2020-3452.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2020-5902.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2021-21972.yaml +31 -0
- moriarty/assets/templates/cves/CVE-2021-21985.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2021-26084.yaml +30 -0
- moriarty/assets/templates/cves/CVE-2021-41773.yaml +25 -0
- moriarty/assets/templates/cves/CVE-2021-42013.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2021-44228.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2022-0185.yaml +21 -0
- moriarty/assets/templates/cves/CVE-2022-1388.yaml +36 -0
- moriarty/assets/templates/cves/CVE-2022-22954.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2022-22965.yaml +31 -0
- moriarty/assets/templates/cves/CVE-2022-26134.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-22515.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-22527.yaml +29 -0
- moriarty/assets/templates/cves/CVE-2023-23752.yaml +33 -0
- moriarty/assets/templates/cves/CVE-2023-27350.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-2868.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-34362.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-3519.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2023-4966.yaml +27 -0
- moriarty/assets/templates/default-logins/admin-weak.yaml +40 -0
- moriarty/assets/templates/default-logins/wordpress-default.yaml +38 -0
- moriarty/assets/templates/exposures/aws-credentials.yaml +35 -0
- moriarty/assets/templates/exposures/backup-files.yaml +36 -0
- moriarty/assets/templates/exposures/database-files.yaml +34 -0
- moriarty/assets/templates/exposures/docker-exposed.yaml +31 -0
- moriarty/assets/templates/exposures/env-exposed.yaml +41 -0
- moriarty/assets/templates/exposures/git-exposed.yaml +41 -0
- moriarty/assets/templates/exposures/phpinfo.yaml +36 -0
- moriarty/assets/templates/exposures/svn-exposed.yaml +28 -0
- moriarty/assets/templates/fuzzing/api-endpoints.yaml +39 -0
- moriarty/assets/templates/fuzzing/common-files.yaml +37 -0
- moriarty/assets/templates/fuzzing/open-redirect-fuzz.yaml +35 -0
- moriarty/assets/templates/fuzzing/xss-search-fuzz.yaml +29 -0
- moriarty/assets/templates/git-config.yaml +18 -0
- moriarty/assets/templates/misconfigurations/cors-misconfiguration.yaml +30 -0
- moriarty/assets/templates/misconfigurations/debug-enabled.yaml +29 -0
- moriarty/assets/templates/misconfigurations/directory-listing.yaml +33 -0
- moriarty/assets/templates/misconfigurations/jwt-none-algo.yaml +30 -0
- moriarty/assets/templates/misconfigurations/ssl-tls-weak.yaml +23 -0
- moriarty/assets/templates/vulnerabilities/lfi-basic.yaml +31 -0
- moriarty/assets/templates/vulnerabilities/open-redirect.yaml +31 -0
- moriarty/assets/templates/vulnerabilities/rce-basic.yaml +34 -0
- moriarty/assets/templates/vulnerabilities/sqli-error.yaml +39 -0
- moriarty/assets/templates/vulnerabilities/ssrf-basic.yaml +31 -0
- moriarty/assets/templates/vulnerabilities/xss-reflected.yaml +38 -0
- moriarty/assets/templates/vulnerabilities/xxe-basic.yaml +30 -0
- moriarty/assets/wordlists/subdomains-1000.txt +1063 -0
- moriarty/cli/__init__.py +3 -0
- moriarty/cli/app.py +120 -0
- moriarty/cli/async_utils.py +19 -0
- moriarty/cli/dns.py +83 -0
- moriarty/cli/domain_cmd.py +572 -0
- moriarty/cli/email.py +383 -0
- moriarty/cli/email_investigate.py +224 -0
- moriarty/cli/intelligence.py +329 -0
- moriarty/cli/output.py +62 -0
- moriarty/cli/rdap.py +94 -0
- moriarty/cli/state.py +38 -0
- moriarty/cli/tls.py +91 -0
- moriarty/cli/user.py +227 -0
- moriarty/core/cache_backend.py +223 -0
- moriarty/core/config_manager.py +303 -0
- moriarty/correlator/__init__.py +0 -0
- moriarty/data/__init__.py +81 -0
- moriarty/data/ioc/__init__.py +142 -0
- moriarty/data/ioc/matcher.py +254 -0
- moriarty/data/ioc/types.py +267 -0
- moriarty/data/local_intelligence.py +507 -0
- moriarty/data/signature_loaders/__init__.py +103 -0
- moriarty/data/signature_loaders/base.py +54 -0
- moriarty/data/signature_loaders/ioc_feed.py +356 -0
- moriarty/data/signature_loaders/wappalyzer.py +112 -0
- moriarty/dsl/__init__.py +0 -0
- moriarty/dsl/loader.py +99 -0
- moriarty/dsl/schema.py +47 -0
- moriarty/export/__init__.py +0 -0
- moriarty/intelligence/__init__.py +27 -0
- moriarty/intelligence/__main__.py +150 -0
- moriarty/intelligence/config.py +395 -0
- moriarty/intelligence/ioc.py +267 -0
- moriarty/intelligence/signatures.py +550 -0
- moriarty/intelligence/storage.py +501 -0
- moriarty/interop/__init__.py +0 -0
- moriarty/logging/__init__.py +0 -0
- moriarty/logging/config.py +47 -0
- moriarty/models/__init__.py +16 -0
- moriarty/models/assertion.py +24 -0
- moriarty/models/entity.py +22 -0
- moriarty/models/evidence.py +37 -0
- moriarty/models/relation.py +24 -0
- moriarty/models/types.py +28 -0
- moriarty/modules/__init__.py +0 -0
- moriarty/modules/avatar_hash.py +184 -0
- moriarty/modules/directory_fuzzer.py +322 -0
- moriarty/modules/dns_scan.py +40 -0
- moriarty/modules/domain_scanner.py +620 -0
- moriarty/modules/email_check.py +98 -0
- moriarty/modules/email_investigate.py +267 -0
- moriarty/modules/email_security.py +274 -0
- moriarty/modules/googlemaps_lookup.py +106 -0
- moriarty/modules/headless_executor.py +201 -0
- moriarty/modules/orchestrator.py +60 -0
- moriarty/modules/passive_recon.py +444 -0
- moriarty/modules/phone_extractor.py +151 -0
- moriarty/modules/pipeline_orchestrator.py +726 -0
- moriarty/modules/port_scanner.py +129 -0
- moriarty/modules/rdap.py +61 -0
- moriarty/modules/rdap_extended.py +188 -0
- moriarty/modules/stealth_mode.py +610 -0
- moriarty/modules/subdomain_discovery.py +595 -0
- moriarty/modules/technology_profiler.py +361 -0
- moriarty/modules/template_executor.py +239 -0
- moriarty/modules/template_scanner.py +1048 -0
- moriarty/modules/tls_scan.py +46 -0
- moriarty/modules/tls_validator.py +188 -0
- moriarty/modules/vuln_scanner.py +483 -0
- moriarty/modules/waf_detector.py +585 -0
- moriarty/modules/wayback_discovery.py +234 -0
- moriarty/modules/web_crawler.py +163 -0
- moriarty/net/__init__.py +0 -0
- moriarty/net/dns_cache.py +175 -0
- moriarty/net/dns_client.py +188 -0
- moriarty/net/rdap_client.py +52 -0
- moriarty/net/smtp_client.py +114 -0
- moriarty/net/tls_client.py +111 -0
- moriarty/parsers/__init__.py +0 -0
- moriarty/parsers/html_parser.py +136 -0
- moriarty/tests/__init__.py +0 -0
- moriarty/tests/test_email_service.py +17 -0
- moriarty/tests/test_models.py +46 -0
- moriarty/tests/test_orchestrator.py +30 -0
- moriarty/tests/test_tls_client.py +18 -0
- moriarty_project-0.1.6.dist-info/METADATA +388 -0
- moriarty_project-0.1.6.dist-info/RECORD +418 -0
- moriarty_project-0.1.6.dist-info/WHEEL +4 -0
- moriarty_project-0.1.6.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
"""Ponto de entrada principal para o módulo de inteligência."""
|
2
|
+
|
3
|
+
import sys
|
4
|
+
import logging
|
5
|
+
from pathlib import Path
|
6
|
+
from typing import List, Optional
|
7
|
+
|
8
|
+
import typer
|
9
|
+
from rich.console import Console
|
10
|
+
from rich.logging import RichHandler
|
11
|
+
|
12
|
+
from . import __version__
|
13
|
+
from .config import init_config, get_config
|
14
|
+
from .cli import app as cli_app
|
15
|
+
|
16
|
+
# Configura o logger
|
17
|
+
logging.basicConfig(
|
18
|
+
level=logging.INFO,
|
19
|
+
format="%(message)s",
|
20
|
+
datefmt="[%X]",
|
21
|
+
handlers=[RichHandler(rich_tracebacks=True)]
|
22
|
+
)
|
23
|
+
|
24
|
+
# Desativa logs de bibliotecas de terceiros
|
25
|
+
logging.getLogger("urllib3").setLevel(logging.WARNING)
|
26
|
+
logging.getLogger("aiohttp").setLevel(logging.WARNING)
|
27
|
+
logging.getLogger("asyncio").setLevel(logging.WARNING)
|
28
|
+
|
29
|
+
# Cria o logger para este módulo
|
30
|
+
logger = logging.getLogger("moriarty.intelligence")
|
31
|
+
|
32
|
+
# Cria a aplicação principal
|
33
|
+
app = typer.Typer(
|
34
|
+
name="moriarty-intel",
|
35
|
+
help="Ferramenta de inteligência de ameaças do Moriarty",
|
36
|
+
add_completion=False,
|
37
|
+
no_args_is_help=True,
|
38
|
+
rich_markup_mode="rich"
|
39
|
+
)
|
40
|
+
|
41
|
+
# Adiciona os comandos da CLI
|
42
|
+
app.add_typer(cli_app, name="cli")
|
43
|
+
|
44
|
+
# Console rico para saída formatada
|
45
|
+
console = Console()
|
46
|
+
|
47
|
+
def version_callback(value: bool):
|
48
|
+
"""Mostra a versão e sai."""
|
49
|
+
if value:
|
50
|
+
console.print(f"[bold blue]Moriarty Intelligence[/] [green]v{__version__}[/]")
|
51
|
+
raise typer.Exit()
|
52
|
+
|
53
|
+
@app.callback()
|
54
|
+
def main(
|
55
|
+
version: bool = typer.Option(
|
56
|
+
None,
|
57
|
+
"--version",
|
58
|
+
"-v",
|
59
|
+
help="Mostra a versão e sai.",
|
60
|
+
callback=version_callback,
|
61
|
+
is_eager=True
|
62
|
+
),
|
63
|
+
config: str = typer.Option(
|
64
|
+
None,
|
65
|
+
"--config",
|
66
|
+
"-c",
|
67
|
+
help="Caminho para o arquivo de configuração.",
|
68
|
+
envvar="MORIARTY_CONFIG"
|
69
|
+
),
|
70
|
+
verbose: bool = typer.Option(
|
71
|
+
False,
|
72
|
+
"--verbose",
|
73
|
+
"-v",
|
74
|
+
help="Ativa o modo verboso."
|
75
|
+
),
|
76
|
+
debug: bool = typer.Option(
|
77
|
+
False,
|
78
|
+
"--debug",
|
79
|
+
"-d",
|
80
|
+
help="Ativa o modo de depuração."
|
81
|
+
)
|
82
|
+
):
|
83
|
+
"""Ferramenta de inteligência de ameaças do Moriarty.
|
84
|
+
|
85
|
+
Uma ferramenta poderosa para coleta, análise e gerenciamento de
|
86
|
+
inteligência sobre ameaças cibernéticas.
|
87
|
+
"""
|
88
|
+
# Configura o nível de log
|
89
|
+
if debug:
|
90
|
+
logging.getLogger().setLevel(logging.DEBUG)
|
91
|
+
logger.setLevel(logging.DEBUG)
|
92
|
+
elif verbose:
|
93
|
+
logging.getLogger().setLevel(logging.INFO)
|
94
|
+
logger.setLevel(logging.INFO)
|
95
|
+
else:
|
96
|
+
logging.getLogger().setLevel(logging.WARNING)
|
97
|
+
logger.setLevel(logging.WARNING)
|
98
|
+
|
99
|
+
# Inicializa a configuração
|
100
|
+
try:
|
101
|
+
init_config(config)
|
102
|
+
logger.debug("Configuração carregada com sucesso")
|
103
|
+
except Exception as e:
|
104
|
+
logger.error(f"Erro ao carregar a configuração: {e}")
|
105
|
+
if debug:
|
106
|
+
logger.exception("Detalhes do erro:")
|
107
|
+
raise typer.Exit(1)
|
108
|
+
|
109
|
+
# Comandos principais
|
110
|
+
@app.command()
|
111
|
+
def init():
|
112
|
+
"""Inicializa o ambiente do Moriarty Intelligence."""
|
113
|
+
from rich.panel import Panel
|
114
|
+
from rich.text import Text
|
115
|
+
|
116
|
+
config = get_config()
|
117
|
+
config_dir = Path(config['storage.path']).parent
|
118
|
+
|
119
|
+
console.print(Panel.fit(
|
120
|
+
"[bold blue]Inicializando o ambiente do Moriarty Intelligence[/]\n\n"
|
121
|
+
f"[bold]Diretório de configuração:[/] {config_dir}\n"
|
122
|
+
f"[bold]Banco de dados:[/] {config['storage.path']}\n"
|
123
|
+
f"[bold]Arquivo de log:[/] {config['logging.file']}",
|
124
|
+
title="Moriarty Intelligence",
|
125
|
+
border_style="blue"
|
126
|
+
))
|
127
|
+
|
128
|
+
# Cria o diretório de configuração se não existir
|
129
|
+
config_dir.mkdir(parents=True, exist_ok=True)
|
130
|
+
|
131
|
+
# Cria o diretório de assinaturas se não existir
|
132
|
+
sig_dir = Path(config['signatures.sources[0].path'])
|
133
|
+
sig_dir.mkdir(parents=True, exist_ok=True)
|
134
|
+
|
135
|
+
# Salva a configuração padrão se o arquivo não existir
|
136
|
+
config_file = config_dir / 'intelligence_config.json'
|
137
|
+
if not config_file.exists():
|
138
|
+
config.save(config_file)
|
139
|
+
console.print(f"[green]✓[/] Arquivo de configuração criado em {config_file}")
|
140
|
+
|
141
|
+
console.print("\n[bold]Configuração concluída com sucesso![/]")
|
142
|
+
console.print("\nUse [bold]moriarty-intel --help[/] para ver os comandos disponíveis.")
|
143
|
+
|
144
|
+
# Ponto de entrada
|
145
|
+
if __name__ == "__main__":
|
146
|
+
try:
|
147
|
+
app()
|
148
|
+
except Exception as e:
|
149
|
+
logger.error(f"Erro inesperado: {e}", exc_info=True)
|
150
|
+
raise typer.Exit(1)
|
@@ -0,0 +1,395 @@
|
|
1
|
+
"""Configurações do módulo de inteligência."""
|
2
|
+
|
3
|
+
import os
|
4
|
+
import json
|
5
|
+
from pathlib import Path
|
6
|
+
from typing import Dict, Any, Optional, List, Union
|
7
|
+
|
8
|
+
# Caminho padrão para o diretório de configuração
|
9
|
+
DEFAULT_CONFIG_DIR = Path.home() / '.moriarty'
|
10
|
+
DEFAULT_CONFIG_FILE = DEFAULT_CONFIG_DIR / 'intelligence_config.json'
|
11
|
+
|
12
|
+
class ConfigError(Exception):
|
13
|
+
"""Exceção para erros de configuração."""
|
14
|
+
pass
|
15
|
+
|
16
|
+
class Config:
|
17
|
+
"""Gerenciador de configurações do módulo de inteligência."""
|
18
|
+
|
19
|
+
_instance = None
|
20
|
+
|
21
|
+
def __new__(cls):
|
22
|
+
if cls._instance is None:
|
23
|
+
cls._instance = super(Config, cls).__new__(cls)
|
24
|
+
cls._instance._initialized = False
|
25
|
+
return cls._instance
|
26
|
+
|
27
|
+
def __init__(self):
|
28
|
+
if self._initialized:
|
29
|
+
return
|
30
|
+
|
31
|
+
self._config = {}
|
32
|
+
self._config_file = None
|
33
|
+
self._initialized = True
|
34
|
+
|
35
|
+
# Carrega as configurações padrão
|
36
|
+
self._load_defaults()
|
37
|
+
|
38
|
+
# Tenta carregar as configurações do arquivo
|
39
|
+
self._config_file = self._find_config_file()
|
40
|
+
if self._config_file:
|
41
|
+
self.load(self._config_file)
|
42
|
+
|
43
|
+
def _load_defaults(self):
|
44
|
+
"""Carrega as configurações padrão."""
|
45
|
+
self._config = {
|
46
|
+
# Configurações de armazenamento
|
47
|
+
'storage': {
|
48
|
+
'type': 'sqlite',
|
49
|
+
'path': str(DEFAULT_CONFIG_DIR / 'intelligence.db'),
|
50
|
+
'in_memory': False
|
51
|
+
},
|
52
|
+
|
53
|
+
# Configurações de coleta
|
54
|
+
'collection': {
|
55
|
+
'enabled': True,
|
56
|
+
'interval': 3600, # segundos
|
57
|
+
'max_items': 1000,
|
58
|
+
'sources': ['all'], # ou lista de fontes específicas
|
59
|
+
'exclude': [] # fontes a serem excluídas
|
60
|
+
},
|
61
|
+
|
62
|
+
# Configurações de assinaturas
|
63
|
+
'signatures': {
|
64
|
+
'enabled': True,
|
65
|
+
'auto_update': True,
|
66
|
+
'update_interval': 86400, # segundos (1 dia)
|
67
|
+
'sources': [
|
68
|
+
{
|
69
|
+
'name': 'default',
|
70
|
+
'type': 'local',
|
71
|
+
'path': str(DEFAULT_CONFIG_DIR / 'signatures'),
|
72
|
+
'enabled': True
|
73
|
+
}
|
74
|
+
]
|
75
|
+
},
|
76
|
+
|
77
|
+
# Configurações de feeds de ameaças
|
78
|
+
'threat_feeds': {
|
79
|
+
'enabled': True,
|
80
|
+
'auto_update': True,
|
81
|
+
'update_interval': 3600, # segundos (1 hora)
|
82
|
+
'feeds': [] # Será preenchido com feeds padrão
|
83
|
+
},
|
84
|
+
|
85
|
+
# Configurações de API
|
86
|
+
'api_keys': {
|
87
|
+
# Chaves de API para serviços externos
|
88
|
+
'virustotal': '',
|
89
|
+
'abuseipdb': '',
|
90
|
+
'shodan': '',
|
91
|
+
'censys_id': '',
|
92
|
+
'censys_secret': '',
|
93
|
+
'greynoise': '',
|
94
|
+
'otx': ''
|
95
|
+
},
|
96
|
+
|
97
|
+
# Configurações de proxy
|
98
|
+
'proxy': {
|
99
|
+
'enabled': False,
|
100
|
+
'http': '',
|
101
|
+
'https': '',
|
102
|
+
'no_proxy': 'localhost,127.0.0.1'
|
103
|
+
},
|
104
|
+
|
105
|
+
# Configurações de logging
|
106
|
+
'logging': {
|
107
|
+
'level': 'INFO',
|
108
|
+
'file': str(DEFAULT_CONFIG_DIR / 'intelligence.log'),
|
109
|
+
'max_size': 10485760, # 10 MB
|
110
|
+
'backup_count': 5
|
111
|
+
},
|
112
|
+
|
113
|
+
# Configurações de cache
|
114
|
+
'cache': {
|
115
|
+
'enabled': True,
|
116
|
+
'ttl': 3600, # segundos (1 hora)
|
117
|
+
'max_size': 1000
|
118
|
+
},
|
119
|
+
|
120
|
+
# Configurações de privacidade
|
121
|
+
'privacy': {
|
122
|
+
'anonymize_ips': False,
|
123
|
+
'anonymize_domains': False,
|
124
|
+
'log_sensitive_data': False
|
125
|
+
},
|
126
|
+
|
127
|
+
# Configurações avançadas
|
128
|
+
'advanced': {
|
129
|
+
'max_workers': 10,
|
130
|
+
'timeout': 30,
|
131
|
+
'retry_attempts': 3,
|
132
|
+
'retry_delay': 5
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
# Adiciona feeds de ameaças padrão
|
137
|
+
self._add_default_feeds()
|
138
|
+
|
139
|
+
def _add_default_feeds(self):
|
140
|
+
"""Adiciona os feeds de ameaças padrão à configuração."""
|
141
|
+
from .collectors import ThreatFeedCollector
|
142
|
+
|
143
|
+
self._config['threat_feeds']['feeds'] = [
|
144
|
+
{
|
145
|
+
'name': feed['name'],
|
146
|
+
'url': feed['url'],
|
147
|
+
'format': feed['format'],
|
148
|
+
'ioc_type': feed['ioc_type'],
|
149
|
+
'threat_type': feed['threat_type'],
|
150
|
+
'confidence': feed['confidence'],
|
151
|
+
'enabled': feed.get('enabled', True),
|
152
|
+
'api_key_required': feed.get('api_key_required', False)
|
153
|
+
}
|
154
|
+
for feed in ThreatFeedCollector.THREAT_FEEDS
|
155
|
+
]
|
156
|
+
|
157
|
+
def _find_config_file(self) -> Optional[Path]:
|
158
|
+
"""Encontra o arquivo de configuração em locais padrão."""
|
159
|
+
# 1. Verifica o caminho especificado na variável de ambiente
|
160
|
+
env_config = os.environ.get('MORIARTY_CONFIG')
|
161
|
+
if env_config:
|
162
|
+
config_path = Path(env_config).expanduser().resolve()
|
163
|
+
if config_path.exists() and config_path.is_file():
|
164
|
+
return config_path
|
165
|
+
|
166
|
+
# 2. Verifica no diretório de configuração do usuário
|
167
|
+
user_config = DEFAULT_CONFIG_FILE
|
168
|
+
if user_config.exists() and user_config.is_file():
|
169
|
+
return user_config
|
170
|
+
|
171
|
+
# 3. Verifica no diretório de instalação do pacote
|
172
|
+
try:
|
173
|
+
import moriarty
|
174
|
+
package_dir = Path(moriarty.__file__).parent
|
175
|
+
package_config = package_dir / 'config' / 'intelligence_config.json'
|
176
|
+
if package_config.exists() and package_config.is_file():
|
177
|
+
return package_config
|
178
|
+
except (ImportError, AttributeError):
|
179
|
+
pass
|
180
|
+
|
181
|
+
# 4. Verifica no diretório de trabalho atual
|
182
|
+
cwd_config = Path.cwd() / 'intelligence_config.json'
|
183
|
+
if cwd_config.exists() and cwd_config.is_file():
|
184
|
+
return cwd_config
|
185
|
+
|
186
|
+
return None
|
187
|
+
|
188
|
+
def load(self, config_file: Union[str, Path] = None):
|
189
|
+
"""Carrega as configurações de um arquivo JSON.
|
190
|
+
|
191
|
+
Args:
|
192
|
+
config_file: Caminho para o arquivo de configuração.
|
193
|
+
Se None, usa o arquivo padrão.
|
194
|
+
"""
|
195
|
+
if config_file is None:
|
196
|
+
config_file = self._config_file or DEFAULT_CONFIG_FILE
|
197
|
+
else:
|
198
|
+
config_file = Path(config_file).expanduser().resolve()
|
199
|
+
|
200
|
+
if not config_file.exists() or not config_file.is_file():
|
201
|
+
raise ConfigError(f"Arquivo de configuração não encontrado: {config_file}")
|
202
|
+
|
203
|
+
try:
|
204
|
+
with open(config_file, 'r', encoding='utf-8') as f:
|
205
|
+
user_config = json.load(f)
|
206
|
+
|
207
|
+
# Atualiza recursivamente o dicionário de configuração
|
208
|
+
self._update_dict(self._config, user_config)
|
209
|
+
self._config_file = config_file
|
210
|
+
|
211
|
+
# Cria o diretório de configuração se não existir
|
212
|
+
if not config_file.parent.exists():
|
213
|
+
config_file.parent.mkdir(parents=True, exist_ok=True)
|
214
|
+
|
215
|
+
except json.JSONDecodeError as e:
|
216
|
+
raise ConfigError(f"Erro ao decodificar o arquivo de configuração {config_file}: {e}")
|
217
|
+
except Exception as e:
|
218
|
+
raise ConfigError(f"Erro ao carregar o arquivo de configuração {config_file}: {e}")
|
219
|
+
|
220
|
+
def save(self, config_file: Union[str, Path] = None):
|
221
|
+
"""Salva as configurações em um arquivo JSON.
|
222
|
+
|
223
|
+
Args:
|
224
|
+
config_file: Caminho para o arquivo de configuração.
|
225
|
+
Se None, usa o arquivo atual ou o padrão.
|
226
|
+
"""
|
227
|
+
if config_file is None:
|
228
|
+
if self._config_file is None:
|
229
|
+
config_file = DEFAULT_CONFIG_FILE
|
230
|
+
else:
|
231
|
+
config_file = self._config_file
|
232
|
+
else:
|
233
|
+
config_file = Path(config_file).expanduser().resolve()
|
234
|
+
|
235
|
+
try:
|
236
|
+
# Garante que o diretório existe
|
237
|
+
config_file.parent.mkdir(parents=True, exist_ok=True)
|
238
|
+
|
239
|
+
with open(config_file, 'w', encoding='utf-8') as f:
|
240
|
+
json.dump(self._config, f, indent=2, ensure_ascii=False)
|
241
|
+
|
242
|
+
self._config_file = config_file
|
243
|
+
|
244
|
+
except Exception as e:
|
245
|
+
raise ConfigError(f"Erro ao salvar o arquivo de configuração {config_file}: {e}")
|
246
|
+
|
247
|
+
def get(self, key: str, default=None) -> Any:
|
248
|
+
"""Obtém um valor de configuração.
|
249
|
+
|
250
|
+
Args:
|
251
|
+
key: Chave de configuração no formato 'section.subsection.key'.
|
252
|
+
default: Valor padrão se a chave não existir.
|
253
|
+
|
254
|
+
Returns:
|
255
|
+
O valor da configuração ou o valor padrão.
|
256
|
+
"""
|
257
|
+
keys = key.split('.')
|
258
|
+
value = self._config
|
259
|
+
|
260
|
+
try:
|
261
|
+
for k in keys:
|
262
|
+
value = value[k]
|
263
|
+
return value
|
264
|
+
except (KeyError, TypeError):
|
265
|
+
return default
|
266
|
+
|
267
|
+
def set(self, key: str, value: Any):
|
268
|
+
"""Define um valor de configuração.
|
269
|
+
|
270
|
+
Args:
|
271
|
+
key: Chave de configuração no formato 'section.subsection.key'.
|
272
|
+
value: Valor a ser definido.
|
273
|
+
"""
|
274
|
+
keys = key.split('.')
|
275
|
+
current = self._config
|
276
|
+
|
277
|
+
for i, k in enumerate(keys[:-1], 1):
|
278
|
+
if k not in current:
|
279
|
+
current[k] = {}
|
280
|
+
current = current[k]
|
281
|
+
|
282
|
+
current[keys[-1]] = value
|
283
|
+
|
284
|
+
def _update_dict(self, d: Dict, u: Dict) -> Dict:
|
285
|
+
"""Atualiza recursivamente um dicionário."""
|
286
|
+
for k, v in u.items():
|
287
|
+
if isinstance(v, dict) and k in d and isinstance(d[k], dict):
|
288
|
+
d[k] = self._update_dict(d[k], v)
|
289
|
+
else:
|
290
|
+
d[k] = v
|
291
|
+
return d
|
292
|
+
|
293
|
+
def to_dict(self) -> Dict:
|
294
|
+
"""Retorna as configurações como um dicionário."""
|
295
|
+
return self._config.copy()
|
296
|
+
|
297
|
+
def __getitem__(self, key: str) -> Any:
|
298
|
+
"""Permite o acesso a itens usando colchetes."""
|
299
|
+
return self.get(key)
|
300
|
+
|
301
|
+
def __setitem__(self, key: str, value: Any):
|
302
|
+
"""Permite a definição de itens usando colchetes."""
|
303
|
+
self.set(key, value)
|
304
|
+
|
305
|
+
def __contains__(self, key: str) -> bool:
|
306
|
+
"""Verifica se uma chave de configuração existe."""
|
307
|
+
try:
|
308
|
+
self.get(key)
|
309
|
+
return True
|
310
|
+
except KeyError:
|
311
|
+
return False
|
312
|
+
|
313
|
+
# Instância global para uso em todo o módulo
|
314
|
+
settings = Config()
|
315
|
+
|
316
|
+
def get_config() -> Config:
|
317
|
+
"""Obtém a instância global de configuração."""
|
318
|
+
return settings
|
319
|
+
|
320
|
+
def init_config(config_file: Union[str, Path] = None):
|
321
|
+
"""Inicializa a configuração global.
|
322
|
+
|
323
|
+
Args:
|
324
|
+
config_file: Caminho para o arquivo de configuração (opcional).
|
325
|
+
"""
|
326
|
+
global settings
|
327
|
+
settings = Config()
|
328
|
+
|
329
|
+
if config_file:
|
330
|
+
settings.load(config_file)
|
331
|
+
elif settings._config_file:
|
332
|
+
settings.load()
|
333
|
+
else:
|
334
|
+
# Cria o diretório de configuração se não existir
|
335
|
+
DEFAULT_CONFIG_DIR.mkdir(parents=True, exist_ok=True)
|
336
|
+
settings.save()
|
337
|
+
|
338
|
+
# Configura o logging
|
339
|
+
_setup_logging()
|
340
|
+
|
341
|
+
def _setup_logging():
|
342
|
+
"""Configura o sistema de logging com base nas configurações."""
|
343
|
+
import logging.config
|
344
|
+
import logging.handlers
|
345
|
+
|
346
|
+
log_config = {
|
347
|
+
'version': 1,
|
348
|
+
'disable_existing_loggers': False,
|
349
|
+
'formatters': {
|
350
|
+
'standard': {
|
351
|
+
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
|
352
|
+
'datefmt': '%Y-%m-%d %H:%M:%S'
|
353
|
+
},
|
354
|
+
'detailed': {
|
355
|
+
'format': '%(asctime)s [%(levelname)s] %(name)s:%(lineno)d: %(message)s',
|
356
|
+
'datefmt': '%Y-%m-%d %H:%M:%S'
|
357
|
+
}
|
358
|
+
},
|
359
|
+
'handlers': {
|
360
|
+
'console': {
|
361
|
+
'class': 'logging.StreamHandler',
|
362
|
+
'level': settings['logging.level'],
|
363
|
+
'formatter': 'standard',
|
364
|
+
'stream': 'ext://sys.stdout'
|
365
|
+
},
|
366
|
+
'file': {
|
367
|
+
'class': 'logging.handlers.RotatingFileHandler',
|
368
|
+
'level': settings['logging.level'],
|
369
|
+
'formatter': 'detailed',
|
370
|
+
'filename': settings['logging.file'],
|
371
|
+
'maxBytes': settings['logging.max_size'],
|
372
|
+
'backupCount': settings['logging.backup_count'],
|
373
|
+
'encoding': 'utf8'
|
374
|
+
}
|
375
|
+
},
|
376
|
+
'loggers': {
|
377
|
+
'moriarty.intelligence': {
|
378
|
+
'handlers': ['console', 'file'],
|
379
|
+
'level': settings['logging.level'],
|
380
|
+
'propagate': False
|
381
|
+
},
|
382
|
+
'': {
|
383
|
+
'handlers': ['console'],
|
384
|
+
'level': 'WARNING',
|
385
|
+
'propagate': False
|
386
|
+
}
|
387
|
+
},
|
388
|
+
'root': {
|
389
|
+
'level': 'WARNING',
|
390
|
+
'handlers': ['console']
|
391
|
+
}
|
392
|
+
}
|
393
|
+
|
394
|
+
# Aplica a configuração de logging
|
395
|
+
logging.config.dictConfig(log_config)
|