From d241efd180353f73aa2f021e24dd0812ef29eb2b Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 7 Jun 2024 10:16:54 +0800 Subject: [PATCH] first commit --- .idea/.gitignore | 8 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 ++ .idea/openstack-api.iml | 8 ++ keystone/__pycache__/domain.cpython-36.pyc | Bin 0 -> 1599 bytes keystone/__pycache__/get_token.cpython-36.pyc | Bin 0 -> 691 bytes keystone/__pycache__/user.cpython-36.pyc | Bin 0 -> 2273 bytes keystone/domain.py | 39 ++++++ keystone/get_token.py | 31 +++++ keystone/group.py | 50 +++++++ keystone/user.py | 71 ++++++++++ main.py | 126 ++++++++++++++++++ 13 files changed, 354 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/openstack-api.iml create mode 100644 keystone/__pycache__/domain.cpython-36.pyc create mode 100644 keystone/__pycache__/get_token.cpython-36.pyc create mode 100644 keystone/__pycache__/user.cpython-36.pyc create mode 100644 keystone/domain.py create mode 100644 keystone/get_token.py create mode 100644 keystone/group.py create mode 100644 keystone/user.py create mode 100644 main.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ecd184d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b23bae5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/openstack-api.iml b/.idea/openstack-api.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/openstack-api.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/keystone/__pycache__/domain.cpython-36.pyc b/keystone/__pycache__/domain.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dcac0e99ddf02040c956609c4cb6c70c7cd5b24 GIT binary patch literal 1599 zcmd6nOK;Oa5Xbl7SCh0VMYIa)iJK86kt!}xK|HU$v=S%^s!Vnv&ck+hH$bb+sa*RF zxN_ht`M`w}Ux5=dwn?J2mvUk)&%S2YJHP#p_t)2Joo~_mA1)z3$x>m^ehRNX03(Q? zW6~{a+NFXC{)KdzaD)pr7oPB;c0?f7pms$~)S>nSJtAS_7wkX|`?w<(_!4p8eF3k& z4@OW+c8Fj*WCr_M8q*m!WJoQuTsW6(=2&OQE(q-99-jLHW3o=Gb-vko)NZ$1ANN}# zokVe>&l_*{o=weQ?>HUFB&4}Nkdcr|hdd9IJe^8ybk09WlRHD5CZU_NILlpw?m3^T zvBEQ=ug=m$%kM!&q=;j^-FTOK5n7#wpNn>lA3*&kwANaD>|=FUi~8 znP)xWHHl>-rrOZg zuViFoB{N*A(G=VmqxjVLHdRd+o68NaYA&}9bPTb?Lf&2Q8DCJe95QoG($FEZK(3G< zh;7KPWah2a%xtZuW&r~*;6<+L$Y1EFWUz%!3kKJPU)O{5Qx*I!xNFQ?41TlBvb)gx zAHxRm$gwoC%%FdXe7)SDiv8X-u_KSrFDYZ56u+F3JgPw<8--3wnnHZ4NXXz|l8WhA UKA|wA@oyCX(!dRZpb>a~0OD0imH+?% literal 0 HcmV?d00001 diff --git a/keystone/__pycache__/get_token.cpython-36.pyc b/keystone/__pycache__/get_token.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d8d6cf758502603a57e8f13f070677a561fefab GIT binary patch literal 691 zcmZ8e%Z}496t$gqo0f-W17AQEC6z{ODuhNtY-ck_peRxma?Lb-#KCqzty-fI zbP;t@ta+_7=89$Lii)@a-s(p0i$K+){J_>!y61n#^) ziF}CZKUZ%SWi5c0-5$@X_rPR{I($tc@T36)k-J?gCF!9TsfPTwgQB=yd J#?-(2{sQ)TtFiz9 literal 0 HcmV?d00001 diff --git a/keystone/__pycache__/user.cpython-36.pyc b/keystone/__pycache__/user.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a26607febbdbb73e71e97e431a451ce32e3c034f GIT binary patch literal 2273 zcmb_dTWcgm6t3#(OZD86UDtK9u4}|q7}+?1MIWLpin}i&@xc`(M22yyHkrvxcW+g< zYeLV1L?j3cK8PSmaD^50K~z}qPxuS!RgyJ-!6(nDo=hfV0*ZFibva#KUFZA0bI!GD zwKV^2>-LW!A-|Kc%YpH0@aP-R2qI{YEEPRnqQVjEQ?ld;S9s7f;fnxzS8x$R?}?Hq zL+^`9&fsc>_$ zO@z10Qm4yuf0O2(@b9rfkOy67lfeGL;zs5Dx!1FFb?#QYCL`l!TB$I#!Kz5L)@c@|5Yw{rqE9nKx5nwW3g^rC3W%xQD?yP z=PNfCmfNwA%gK7W8b`}wdOx0sxX(OR{;d$_}us;ujA?%KY*|9LQU6up6_nZOC*$`fD0^ZY+qt??p zQ^>GkD>79j7}Z@>flgJiK`hiXHV8q{oQ07IVYzii<6G@R1K!Z{R6P!(HoAxx+DBfz z1(Tr{Y{CnMUZ4j9_v0%dDQ||{ARk;9cqpG4k~?dTx(ef91|)Rn>U%_RkW%ab zW-I|917Y07w-;{?5m4vgcm)Ff7y`&sAqgMEko7=LomBQG@hBhS(d>xx@QFqY5s{0u zMk{cui!dMIg1C-wc@rin$w^LgXOkh9f`Y%7Fnl`@k`PoFaDa+s-Ot%J*>wkAO1n<( z0a^hlz|Z|IvjN5z)f2Fz@uX6*+Niw?lADdN40*MoRo|NC^%I-x8rH zS%k}oo~Z0NfHo$nYJs785`Op}5j^+}_Ao(TYTa6q8Ai{eFTda4`gL#X{=wG|_P4&+ z`}~`~nfD(2^2fvP>W)2uDMOw~Gu_1W1M!JcDx%gGvL{oio&igJk`#3b*Vzz$3P&f! zF(g^sz=rY*ut?+i2|F)^+m$%7!mWP&UFm?0TXMT=lR>S*~i5sMTv8R-Ds=VIyoDE`rZ7sTHuIg4HZEmcPB9K6`Zkll|?7`(OP$M(eow7_9|s z{t=xDs(X=wR2fH>)zU<$Emb0UcXVcT1s5I>J%!U#**=#gP%I0!M_arMpXdwFjA*w- zsl?7gI=AFM2k+{<$N|W`tyDJA7iY(SwF*(Vax694qG9U=f3+WrtS7HiSYd-61V(w4 K`#j`jUik|MY6x=x literal 0 HcmV?d00001 diff --git a/keystone/domain.py b/keystone/domain.py new file mode 100644 index 0000000..f5ea945 --- /dev/null +++ b/keystone/domain.py @@ -0,0 +1,39 @@ +import requests +import json +def get_domain(ip, token): + url = "http://" + ip + ":5000/v3/domains" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def get_domain_id(ip, token, domain_name): + url = "http://" + ip + ":5000/v3/domains" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + for i in response.json()['domains']: + if i['name'] == domain_name: + domain_id = i['id'] + return domain_id +def create_domain(ip, token, domain_name, description): + url = "http://" + ip + ":5000/v3/domains" + headers = {'X-Auth-Token': token} + data = { + "domain": { + "description": description, + "enabled": True, + "name": domain_name + } + } + response = requests.post(url, headers=headers, data=json.dumps(data)) + return response.json() +def show_domain(ip, token,domain_name): + domain_id = get_domain_id(ip, token, domain_name) + url = "http://" + ip + ":5000/v3/domains/" + domain_id + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def delete_domain(ip, token, domain_name): + domain_id = get_domain_id(ip, token, domain_name) + url = "http://" + ip + ":5000/v3/domains/" + domain_id + headers = {'X-Auth-Token': token} + response = requests.delete(url, headers=headers) + return response.json() \ No newline at end of file diff --git a/keystone/get_token.py b/keystone/get_token.py new file mode 100644 index 0000000..288b980 --- /dev/null +++ b/keystone/get_token.py @@ -0,0 +1,31 @@ +import requests +ip="" +domain_name="" +project_name="" +user_name="" +password="" +def get_token(ip,domain_name,project_name,user_name,password): + url=f"http://{ip}:5000/v3/auth/tokens" + auth_data = { + "auth": { + "identity": { + "methods": ["password"], + "password": { + "user": { + "name": user_name, + "domain": {"name": domain_name}, + "password": password + } + } + }, + "scope": { + "project": { + "name": project_name, + "domain": {"name": domain_name} + } + } + } + } + resp=requests.post(url=url,json=auth_data) + token=resp.headers['X-Subject-Token'] + return token \ No newline at end of file diff --git a/keystone/group.py b/keystone/group.py new file mode 100644 index 0000000..a641270 --- /dev/null +++ b/keystone/group.py @@ -0,0 +1,50 @@ +import requests +import json +def create_group(ip, token, group_name, description): + url = "http://" + ip + ":5000/v3/groups" + headers = {'X-Auth-Token': token} + data = { + "group": { + "name": group_name, + "domain_id": "default", + "description": description + } + } + response = requests.post(url, headers=headers, data=json.dumps(data)) + return response.json() +def get_group_id(ip, token, group_name): + url = "http://" + ip + ":5000/v3/groups" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + for i in response.json()['groups']: + if i['name'] == group_name: + return i['id'] +def show_group(ip, token, group_name): + group_id = get_group_id(ip, token, group_name) + url = "http://" + ip + ":5000/v3/groups/" + group_id + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def delete_group(ip, token, group_name): + group_id = get_group_id(ip, token, group_name) + url = "http://" + ip + ":5000/v3/groups/" + group_id + headers = {'X-Auth-Token': token} + response = requests.delete(url, headers=headers) + return response.json() +def get_group(ip, token): + url = "http://" + ip + ":5000/v3/groups" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def update_group(ip, token, group_name, new_group_name, new_description): + group_id = get_group_id(ip, token, group_name) + url = "http://" + ip + ":5000/v3/groups/" + group_id + headers = {'X-Auth-Token': token} + data = { + "group": { + "name": new_group_name, + "description": new_description + } + } + response = requests.patch(url, headers=headers, data=json.dumps(data)) + return response.json() \ No newline at end of file diff --git a/keystone/user.py b/keystone/user.py new file mode 100644 index 0000000..dd58171 --- /dev/null +++ b/keystone/user.py @@ -0,0 +1,71 @@ +import requests +import json +def create_user(ip, token, user_name, password, description): + headers = {'X-Auth-Token': token} + body = { + "user": { + "name": user_name, + "password": password, + "description": description, + } + } + resp = requests.post(f"http://{ip}:5000/v3/users", data=json.dumps(body), headers=headers) + return resp.json() # Assuming the API returns JSON + + +def get_users(ip, token): + headers = {'X-Auth-Token': token} + resp = requests.get(f"http://{ip}:5000/v3/users", headers=headers) + return resp.json() # Assuming the API returns JSON + + +def get_user_id(ip, token, user_name): + headers = {'X-Auth-Token': token} + result = requests.get(f"http://{ip}:5000/v3/users", headers=headers).json() + for item in result['users']: + if item['name'] == user_name: + return item['id'] + return "NONE" + + +def get_user(ip, token, user_name): + user_id = get_user_id(ip, token, user_name) + if user_id == "NONE": + return {"error": "User not found"} + + headers = {'X-Auth-Token': token} + api_url = f"http://{ip}:5000/v3/users/{user_id}" + resp = requests.get(api_url, headers=headers) + return resp.json() # Assuming the API returns JSON + + +def delete_user(ip, token, user_name): + user_id = get_user_id(ip, token, user_name) + if user_id == "NONE": + return {"error": "User not found"} + + headers = {'X-Auth-Token': token} + api_url = f"http://{ip}:5000/v3/users/{user_id}" + resp = requests.delete(api_url, headers=headers) + if resp.status_code == 204: + return {"message":"用户删除成功"} + else: + return {"error": "用户删除失败", "status_code": resp.status_code} +def update_user_password(ip, token, user_name, new_password, original_password): + user_id = get_user_id(ip, token, user_name) + if user_id == "NONE": + return {"error": "User not found"} + + headers = {'X-Auth-Token': token} + body = { + "user": { + "password": new_password, + "original_password": original_password + } + } + api_url = f"http://{ip}:5000/v3/users/{user_id}/password" + resp = requests.post(api_url, data=json.dumps(body), headers=headers) + if resp.status_code == 204: + return {"message": "密码更新成功"} + else: + return {"error": "密码更新失败", "status_code": resp.status_code} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..64327d5 --- /dev/null +++ b/main.py @@ -0,0 +1,126 @@ +from keystone import get_token +from keystone import user +from keystone import domain +import time +def main(): + print("====================") + print("选择一个操作:") + print("====================") + print("Keystone操作") + print("1. 用户管理") + print("2. 组管理") + print("3. 域管理") + print("====================") + choice = input("输入选项 (1-3): ") + + ip = "172.30.26.171" + token = get_token.get_token(ip,'demo','admin','admin','000000') + + if choice == '1': + print("====================") + print("选择一个操作:") + print("1. 创建用户") + print("2. 获取所有用户") + print("3. 获取特定用户信息") + print("4. 删除用户") + print("5. 更新用户密码") + print("====================") + choice = input("输入选项 (1-5): ") + print("====================") + if choice == '1': + user_name = input("请输入用户名: ") + password = input("请输入密码: ") + description = input("请输入描述: ") + result = user.create_user(ip, token, user_name, password, description) + print(result) + print("====================") + main() + + elif choice == '2': + result = user.get_users(ip, token) + print(result) + main() + + elif choice == '3': + user_name = input("请输入用户名: ") + result = user.get_user(ip, token, user_name) + print(result) + main() + + elif choice == '4': + user_name = input("请输入用户名: ") + result = user.delete_user(ip, token, user_name) + print(result) + main() + + elif choice == '5': + user_name = input("请输入用户名: ") + new_password = input("请输入新密码: ") + original_password = input("请输入原始密码: ") + result = user.update_user_password(ip, token, user_name, new_password, original_password) + print(result) + main() + + else: + print("无效选项") + main() + + elif choice == '2': + print("====================") + print("选择一个操作:") + print("1. 创建组") + print("2. 获取所有组") + print("3. 获取特定组信息") + print("4. 删除组") + print("5. 更新组信息") + print("====================") + choice = input("输入选项 (1-5): ") + print("====================") + if choice == '1': + user_name = input("请输入组名: ") + password = input("请输入域: ") + description = input("请输入描述: ") + result = user.create_user(ip, token, user_name, password, description) + print(result) + print("====================") + main() + + elif choice == '2': + result = user.get_users(ip, token) + print(result) + main() + + elif choice == '3': + user_name = input("请输入用户名: ") + result = user.get_user(ip, token, user_name) + print(result) + main() + + elif choice == '4': + user_name = input("请输入用户名: ") + result = user.delete_user(ip, token, user_name) + print(result) + main() + + elif choice == '5': + user_name = input("请输入用户名: ") + new_password = input("请输入新密码: ") + original_password = input("请输入原始密码: ") + result = user.update_user_password(ip, token, user_name, new_password, original_password) + print(result) + main() + + else: + print("无效选项") + main() + # + # elif choice == '3': + # + # elif choice == '4': + # + # elif choice == '5': + else: + print("无效选项") + main() +if __name__ == "__main__": + main()