{ "info": { "author": "sysadmin", "author_email": "sysadmin@douban.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# SA Tools Core\n\n![](https://img.shields.io/pypi/status/sa-tools-core)\n![](https://img.shields.io/pypi/v/sa-tools-core)\n![](https://img.shields.io/pypi/pyversions/sa-tools-core)\n![](https://img.shields.io/pypi/wheel/sa-tools-core)\n![](https://img.shields.io/pypi/l/sa-tools-core)\n\nSA Tools \u987e\u540d\u601d\u4e49\u662f System Administrator \u7684\u5de5\u5177\u96c6\uff0c\u5305\u542b\u4e00\u4e9b\u5b9e\u7528\u5de5\u5177\uff0c\u6d89\u53ca DNS \u7ba1\u7406\u3001\u8fdc\u7a0b\u6279\u91cf\u6267\u884c\u811a\u672c\u3001\u65e5\u5fd7\u5206\u6790\u67e5\u8be2\u3001\u901a\u77e5\u63d0\u9192\u7b49\u3002\n\n## Installation\n\n```\npip install sa-tools-core\n```\n\n## Development Guide\n\nCurrently support python2.7 ~ python3.7\n\n### Quick start\n\n```\n# first clone this repo\ncd sa-tools-core\n\nmake init\n```\n\nSee Makefile for more details.\n\n### Re-install after modify codes\n\n```\nmake install\n```\n\n## Configuration\n\n```\ncp local_config.py.example local_config.py\n# then edit local_config.py\nvi local_config.py\n```\n\nYou can use a system-wide configuration path as well, by default it is `/etc/sa-tools/config.py`.\n\nLocal configs will override [sa_tools_core/consts.py](sa_tools_core/consts.py).\n\nFor other third party service configs, see [examples/config](examples/config).\n\nYou can put third party service configs to `/etc/sa-tools/` directory.\n\n## Command Line Tools\n\nFor all the CLI tools, you can type `-h` or `--help` to get help messages and examples.\n\n### sa-notify\n\n\u901a\u77e5\u63d0\u9192\u5de5\u5177\uff0c\u652f\u6301 wechat, wework(\u4f01\u4e1a\u5fae\u4fe1), email, sms, pushbullet, pushover, telegram \u7b49\u591a\u79cd\u901a\u77e5\u7c7b\u578b\u3002\n\n```shell\nsa-notify --wechat user1 --content 'xxx'\necho 'xxx' | sa-notify --wechat user1,user2 --email user1@example.com user3@example.com\n```\n\n### sa-dns\n\nDNS \u7ba1\u7406\u5de5\u5177\uff0c\u76ee\u524d\u4ec5\u652f\u6301 DNSPod\u3002\n\n```shell\n# \u5207 A \u8bb0\u5f55\nsa-dns ensure main --type A --value 1.1.1.1 --enable\n# dry-run\nsa-dns ensure main --type A --value 1.1.1.1 --enable --dry-run\n# \u5207 A \u8bb0\u5f55\uff0c\u72ec\u5360\nsa-dns ensure main --type A --value 1.1.1.1 --enable --excl\n# \u8c03\u6574 ttl\nsa-dns ensure main --type A --value 1.1.1.1 --ttl 100 --enable\n# \u6279\u91cf\u5207 CNAME \u8bb0\u5f55\uff0c\u5e38\u7528\u4e8e CNAME \u5230 CDN \u7b49\u64cd\u4f5c\nsa-dns ensure main --type CNAME --value {domain}.h1.aqb.so. --enable\n\n# \u67e5\u627e\u5b50\u57df\u8bb0\u5f55\nsa-dns list -S music\n# \u67e5\u627e aqb \u76f8\u5173\u8bb0\u5f55\uff08\u53ea\u8fd4\u56de\u7b26\u5408\u8be5\u5173\u952e\u5b57\u7684\u8bb0\u5f55\uff09\nsa-dns list -s aqb\n# \u6309\u6b63\u5219\u67e5\u627e\u5b50\u57df\uff08\u67e5\u770b aqb \u7684\u6d4b\u8bd5\u57df\u540d\uff09\nsa-dns list | grep -E '^.*aqb\\s'\n\n# \u652f\u6301\u901a\u8fc7 -d,--domain \u6307\u5b9a\u5176\u4ed6\u57df\u540d\nsa-dns -d dou.bz list\n```\n\n[see more](docs/sa-dns.md)\n\n### sa-script\n\nA remote script runner tool based on ansible. To use it, you need to prepare your ansible environment first.\n\n\u8fdc\u7a0b\u547d\u4ee4\u6267\u884c\u5de5\u5177\uff0c\u76ee\u524d\u57fa\u4e8e ansible\uff0c\u9700\u8981\u4e8b\u5148\u914d\u7f6e\u597d ansible \u73af\u5883(/etc/ansible/hosts)\u3002\n\n\u4e00\u4e9b\u7279\u70b9\uff0c\n\n- \u517c\u5bb9 ansible host pattern\n- \u811a\u672c\u53ef\u4ece stdin \u4f20\u5165\u6216\u6307\u5b9a\u6587\u4ef6\u8def\u5f84\uff0c\u82e5\u90fd\u4e0d\u6307\u5b9a\u5219\u4f1a\u8c03\u7528 editor \u8fdb\u5165\u7f16\u8f91\u6a21\u5f0f(\u7c7b\u4f3c git commit \u65f6\u7684\u884c\u4e3a)\u3002\n- \u6279\u91cf\u6267\u884c\uff0c\u6709\u8fdb\u5ea6\u6761\n- \u6267\u884c\u5b8c\u6bd5\u540e\u4f1a\u8fdb\u5165\u4ea4\u4e92\u6a21\u5f0f\uff0c\u53ef\u4ee5\u5bf9\u7ed3\u679c\u8fdb\u884c\u7b5b\u9009\uff0c\u652f\u6301 shell \u7ba1\u9053\u64cd\u4f5c\uff0c\u652f\u6301\u518d\u6b21\u53d1\u8d77\u6267\u884c\n\n```shell\n$ echo 'uptime && echo $HOSTNAME $(whoami)' | sa-script test_zk\nExecuting...\n100%|######################################################|Elapsed Time: 0:00:09\n\n+----------+----+-------------------------------------------------------+--------+\n| host | rc | stdout | stderr |\n+----------+----+-------------------------------------------------------+--------+\n| test-zk3 | 0 | 11:40:15 up 384 days, 19:00, 1 user, load average: | |\n| | | 0.16, 0.20, 0.26 test-zk3 user1 | |\n| test-zk2 | 0 | 11:40:15 up 392 days, 20:00, 1 user, load average: | |\n| | | 0.25, 0.22, 0.30 test-zk2 user1 | |\n| test-zk1 | 0 | 11:40:15 up 392 days, 23:53, 1 user, load average: | |\n| | | 0.30, 0.22, 0.25 test-zk1 user1 | |\n+----------+----+-------------------------------------------------------+--------+\n```\n\nSee `sa-script -h` for more details.\n\nTODO: add a gif to demonstrate.\n\n### sa-access\n\naccess log \u67e5\u8be2\u5206\u6790\u5de5\u5177\uff0c\u652f\u6301\u7b80\u5355\u67e5\u8be2\uff0c\u805a\u5408\u67e5\u8be2\uff0c\u65f6\u6bb5\u5bf9\u6bd4\u5206\u6790\u7b49\n\n```shell\nsa-access query\nsa-access query --term ip 1.1.1.1\nsa-access query -t host example.com -x bandwidth --by ip\nsa-access query --term appname app1 -x count --by-script \"doc['remote_addr'].value + ' ' + doc['normalize_url'].value\"\nsa-access query --term appname app1 -x count --by-script \"def ip=doc['remote_addr'].value; ip.substring(0, ip.lastIndexOf('.')) + ' ' + doc['normalize_url'].value\"\nsa-access analyze --term host example.com -x sum bytes_sent --by nurl -a '2017-03-28 09:30' -d 15 -b '2017-03-28 10:30'\n```\n\n[see more](docs/sa-access.md)\n\n### sa-icinga\n\n\u4e00\u4e2a Icinga2 \u7684 CLI \u5de5\u5177\u3002\n\nicinga2 doc: \n\n```shell\n# try test\nsa-icinga notify --wechat user1 --email user1@example.com --test\n\nsa-icinga notify --wechat user1 --email user1@example.com # need icinga pass os environment vars\n\nsa-icinga ack --host sa --service check-puppet --comment 'hehe'\nsa-icinga ack --host 'sa*' --service 'check-puppet'\nsa-icinga ack --host 'sa*' --service 'check-puppet' --remove\n\nsa-icinga show --filter 'host.name == \"sa\" && service.name == \"check-puppet\"'\nsa-icinga show --type host --filter 'match(\"sa*\", host.name)' | less\nsa-icinga show --type service --filter 'regex(\"check_[a-z]*\", service.name)' | less\nsa-icinga show --type notification --filter 'notification.host_name == \"sa\"' | less\nsa-icinga show --type user | grep user1\nsa-icinga show --filter 'service.name == \"check-puppet\"' --attrs acknowledgement\n```\n\n[see more](docs/sa-icinga.md)\n\n### sa-disk\n\n\u78c1\u76d8\u76f8\u5173\u5de5\u5177\uff0c\u5229\u7528 ncdu \u5feb\u901f\u626b\u76d8\uff0c\u5e76\u53ef\u4ee5\u4fdd\u5b58\u3001\u5206\u6790\u7ed3\u679c\u3002\n\n```shell\nsa-disk usage\nsa-disk usage -n 5 -d 3\nsa-disk usage -r /data1/ncdu-export-%-20160513142844.gz\nsa-disk usage -c /tmp\nsa-disk usage -p /data\nsa-disk usage --force-check\n\nsa-disk clean\n```\n\n[see more](docs/sa-disk.md)\n\n### sa-bs\n\n`sa-bs` \u662f\u5bf9\u817e\u8baf\u4e91 API/CLI \u7684\u5c01\u88c5\uff0c\u652f\u6301\u9ed1\u77f3\u3001CVM \u7b49\u4ea7\u54c1\u3002\n\n\u9700\u8981\u5148\u5b89\u88c5\u5e76\u914d\u7f6e [qcloudcli](https://github.com/QcloudApi/qcloudcli)\u3002\n\n```shell\nsa-bs device list -j\nsa-bs device list -a alias\nsa-bs device list --alias host\nsa-bs vpc list -e createTime vpcId\nsa-bs vpc subnet\nsa-bs vpc subnet_ips --vpcId 1001 --subnetId 6555 -j\nsa-bs vpc subnet_ips --subnetName SA\nsa-bs vpc subnet_by_cpm_id --alias host22\nsa-bs eip list -a eip\nsa-bs lb list\nsa-bs -vvvv eip list --eipIds '[\\\\\"eip-xxxxxxxx\\\\\"]' -r\nsa-bs eip list --eip 1.1.1.1\nsa-bs vpc register_batch_ip --subnetName SA --ip 10.0.0.1\nsa-bs eip apply\nsa-bs eip bind_vpc_ip --eip 1.1.1.1 --vpcIp 10.0.0.1\nsa-bs vpc create_interface --alias host11 host22 --subnetName DBA-dummy\nsa-bs device reload_os --passwd XXXXXX --subnetName OfflineComputation --alias host88\nsa-bs device modify_alias --alias host33 --instanceId cpm-xxxxxxxx\nsa-bs -vvvv vpc create_subnet --subnetName Isolation-dummy --cidrBlock 10.0.1.0/24 --vlanId 2222\n\n## \u673a\u578b\u7ec4\u5408\nsa-bs device list -e deviceClassCode\nsa-bs device os --deviceClassCode Y0-BS09v2 -a osNameDisplay osTypeId\nsa-bs device class_partition --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 --deviceClassCode \"Y0-BS09v2\"\nsa-bs device class_partition --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64\nsa-bs device elastic_price --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64\nsa-bs device inventory --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 --deviceClassCode \"Y0-BS09v2\" --subnetName OfflineComputation\nsa-bs device hardware_info --alias host11\nsa-bs device hardware_specification\n\n### \u8d2d\u4e70\u673a\u5668 ( see https://cloud.tencent.com/document/api/386/6638 )\nsa-bs device buy --goodsNum 2 --timeSpan 1 --timeUnit m --alias new_host \\\n --subnetName SA --ip 10.0.0.2 10.0.0.3 \\\n --cpuId 4 --diskNum1 2 --diskNum2 12 --diskTypeId1 1 --diskTypeId2 6 --haveRaidCard 0 --mem 64 \\\n --raidId 25 \\\n --deviceClassCode \"Y0-BS09v2\" --needSecurityAgent 0 --needMonitorAgent 0 --autoRenewFlag 1\nsa-bs device deploy_process --instanceId cpm-xxxxxxxx\nsa-bs device deploy_process --alias host11\nsa-bs device operation_log --alias host22\n\n## CVM\n\nsa-bs cvm instances\n```\n\n## Client\n\nTools can be called from client as well.\n\n```python\nfrom sa_tools_core.client import Client\n\nc = Client()\nc.notify(wework='user1', content='hehe')\nc.uptime()\nc.dns.list(S='@')\n```\n\nSee [sa_tools_core/client.py](sa_tools_core/client.py) for more details.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/douban/sa-tools-core", "keywords": "sa-tools,sysadmin,command line tools", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "sa-tools-core", "package_url": "https://pypi.org/project/sa-tools-core/", "platform": "", "project_url": "https://pypi.org/project/sa-tools-core/", "project_urls": { "Homepage": "https://github.com/douban/sa-tools-core" }, "release_url": "https://pypi.org/project/sa-tools-core/0.1.4/", "requires_dist": [ "setuptools", "six", "wechat3", "requests", "pydnspod2", "elasticsearch (<7.0.0,>=6.0.0)", "humanize", "sentry-sdk", "Mako", "icinga2py", "inflect", "ansible (>=2.8) ; extra == 'script'", "progressbar2 ; extra == 'script'", "terminaltables ; extra == 'script'" ], "requires_python": "", "summary": "SA Tools Core", "version": "0.1.4" }, "last_serial": 5707612, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "412b876791fc27a943f05853a010619b", "sha256": "f67d5485dad0a9a74676a4d9d8c19ee82fb740864b18441691f6e20564f047c3" }, "downloads": -1, "filename": "sa_tools_core-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "412b876791fc27a943f05853a010619b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 154115, "upload_time": "2019-07-25T10:58:45", "url": "https://files.pythonhosted.org/packages/74/8b/08bbdc89cef9b4de0a2d63aed7a6ecb38312321ccc37c8b82cd9248f3245/sa_tools_core-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d5fec928e439af5452fcbfa450fa4f6a", "sha256": "f05ae15713319bf432851672f3c6dfb51c058fdb3cd726d21bfd08d2b37a6b84" }, "downloads": -1, "filename": "sa-tools-core-0.1.0.tar.gz", "has_sig": false, "md5_digest": "d5fec928e439af5452fcbfa450fa4f6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67845, "upload_time": "2019-07-25T10:58:49", "url": "https://files.pythonhosted.org/packages/b5/42/f17a84bdccff229911a2d76dcc12fef895f0e2d4f3a0c40fe947654c5cb5/sa-tools-core-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "37fcaf9b753590c8332ecf86a851b53e", "sha256": "616a77e33f2afa0d9f6a930e09644f171537d21361ac371e29e23abac2c9fa89" }, "downloads": -1, "filename": "sa_tools_core-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "37fcaf9b753590c8332ecf86a851b53e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 154260, "upload_time": "2019-07-26T09:08:57", "url": "https://files.pythonhosted.org/packages/9a/c9/ba4abb561bc9449b2a01a1e2a1382899f9a0c9c7315dfcf92e84b8c15a4f/sa_tools_core-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c96a994e5a41cb6d988b5061f9e2ae73", "sha256": "23debd09222116966a1aad28c029d4ca8aae1129c332a37c73f40f451aaa461f" }, "downloads": -1, "filename": "sa-tools-core-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c96a994e5a41cb6d988b5061f9e2ae73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67785, "upload_time": "2019-07-26T09:08:59", "url": "https://files.pythonhosted.org/packages/4f/c4/e62be8ee09f225397054aa670f0de8da71f0566089d88c21a9fc607ad76a/sa-tools-core-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "1843a89d79708bb6e2bd75ffc278f77c", "sha256": "bb0e8aac3460972967e63ed0d476734b988ea8516ef413f2f142f4dfb6be7e97" }, "downloads": -1, "filename": "sa_tools_core-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1843a89d79708bb6e2bd75ffc278f77c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 154711, "upload_time": "2019-08-01T07:32:30", "url": "https://files.pythonhosted.org/packages/db/66/a86169f60be3385ad4e0e1d80fb9da5f2c816e23b5ee9533bf7ccafe2eed/sa_tools_core-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1464eff41e17cce95ca3cce719631d7c", "sha256": "6f8a376551d90f55f87f33d912003991fe65d5cb839df548c41f9ee720efa34b" }, "downloads": -1, "filename": "sa-tools-core-0.1.2.tar.gz", "has_sig": false, "md5_digest": "1464eff41e17cce95ca3cce719631d7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68243, "upload_time": "2019-08-01T07:32:32", "url": "https://files.pythonhosted.org/packages/79/91/2d838c93012e383ddb1e580601de7d55d6ed136b2ac3ebbe91cc80c67092/sa-tools-core-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "260558311c23b939cea27c58ae8e744d", "sha256": "7eaa01eda1a71b658eec641c532a81029312190b39ae4d6f8861df77be85d3e2" }, "downloads": -1, "filename": "sa_tools_core-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "260558311c23b939cea27c58ae8e744d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 154730, "upload_time": "2019-08-01T07:47:32", "url": "https://files.pythonhosted.org/packages/c0/72/e15f3911bb1516f07f69089c23264ac65d53099d6acc2a9c1bf8f834f35e/sa_tools_core-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62b2d9df5d1d9dbb6637ec4ec6d548d7", "sha256": "09ff051aa01c1e6f5d7f6b160891266602491b14f55409d83788944b4ed1d524" }, "downloads": -1, "filename": "sa-tools-core-0.1.3.tar.gz", "has_sig": false, "md5_digest": "62b2d9df5d1d9dbb6637ec4ec6d548d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68273, "upload_time": "2019-08-01T07:47:35", "url": "https://files.pythonhosted.org/packages/d4/8e/a66ba8454b29ba40dd0a06cca7b49348b4da806068c991f352c8664820ed/sa-tools-core-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "5b63c7107b9ae7dd5356889136ff4319", "sha256": "a610231d55530eef107cc4703c57209da5d707906486f58826635121f14ba496" }, "downloads": -1, "filename": "sa_tools_core-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5b63c7107b9ae7dd5356889136ff4319", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 155156, "upload_time": "2019-08-21T07:45:10", "url": "https://files.pythonhosted.org/packages/6e/19/d977936158ed910f8fd19dc614bf095cb1b0dab5133e07634d1326d3006a/sa_tools_core-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6924ee08b886c7a4497830c9f689af5e", "sha256": "73a99c13bdc09fa8afc16d9c716d4d53e1716520e3e59a5b6374410649adb93a" }, "downloads": -1, "filename": "sa-tools-core-0.1.4.tar.gz", "has_sig": false, "md5_digest": "6924ee08b886c7a4497830c9f689af5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68696, "upload_time": "2019-08-21T07:45:13", "url": "https://files.pythonhosted.org/packages/3c/32/693b2ba5363ba683220bce1557aa50c697c9f7cbff5bbdc3d29feb260e8b/sa-tools-core-0.1.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5b63c7107b9ae7dd5356889136ff4319", "sha256": "a610231d55530eef107cc4703c57209da5d707906486f58826635121f14ba496" }, "downloads": -1, "filename": "sa_tools_core-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5b63c7107b9ae7dd5356889136ff4319", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 155156, "upload_time": "2019-08-21T07:45:10", "url": "https://files.pythonhosted.org/packages/6e/19/d977936158ed910f8fd19dc614bf095cb1b0dab5133e07634d1326d3006a/sa_tools_core-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6924ee08b886c7a4497830c9f689af5e", "sha256": "73a99c13bdc09fa8afc16d9c716d4d53e1716520e3e59a5b6374410649adb93a" }, "downloads": -1, "filename": "sa-tools-core-0.1.4.tar.gz", "has_sig": false, "md5_digest": "6924ee08b886c7a4497830c9f689af5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68696, "upload_time": "2019-08-21T07:45:13", "url": "https://files.pythonhosted.org/packages/3c/32/693b2ba5363ba683220bce1557aa50c697c9f7cbff5bbdc3d29feb260e8b/sa-tools-core-0.1.4.tar.gz" } ] }