Python3批量创建Crowd用户并分配组


Posted in Python onMay 20, 2020

背景

迁移 Crowd 完成后(之前采用 LDAP 方式,新迁移 Crowd 不采用),需要批量创建公司所有员工的用户以及分配组,手工创建以及之前 Postman 的方式还是比较低效。

Python 在 N 多年前入门,写了几个爬虫脚本后,再也没用过,借这个机会顺便再熟悉下 Python 脚本。

归根结底的原因就是:本人很懒~

Crowd Api

https://docs.atlassian.com/atlassian-crowd/3.2.0/REST/

如下示例是基于 Crowd 3.2.0 版本的 Api,不同版本间的 Api 稍有差异。

# 添加用户
$ curl -u "application-name:password" -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d "{\"name\" : \"test.user\", \"display-name\" : \"Test User\", \"active\" : true, \"first-name\" : \"Test\", \"email\" : \"test.user@ourdomain.com\", \"last-name\" : \"User\", \"password\" : {\"value\" : \"mypassword\"} }" http://localhost:8095/crowd/rest/usermanagement/1/user

# 用户添加到组
$ curl -u "application-name:password" -X POST -H "Content-Type: application/json" -d "{\"name\" : \"all-users\"}" http://localhost:8095/crowd/rest/usermanagement/1/user/group/direct\?username\=daodaotest

注意:此处-u的参数为 Crowd 中应用(Application)的用户名和密码,Crowd 的管理员是不能添加用户。

Python 实现脚本

实现添加 Crowd 用户,用户添加到指定组,读取 csv 文件批量添加用户和设定的多个组。

crowdUsers.csv 用户数据 csv 文件

name,displayName,email
daodaotest1,daodaotest1,daodaotest1@daodaotest.com
daodaotest2,daodaotest2,daodaotest2@daodaotest.com
daodaotest3,daodaotest3,daodaotest3@daodaotest.com
......

addCrowdUsers.py 批量添加 Crowd 用户和用户组脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# Filename     addCrowdUsers.py
# Revision     0.0.1
# Date       2020/5/14
# Author      jiangliheng
# Email      jiang_liheng@163.com
# Website     https://jiangliheng.github.io/
# Description   批量添加 Crowd 用户和用户组

import requests
from requests.auth import HTTPBasicAuth
import csv
from itertools import islice

# 请求 headers
headers = {
  'Accept': 'application/json',
  'Content-type': 'application/json',
}

# crowd 访问基础路径
base_url='http://localhost:8095'

# 添加用户的默认用户组和密码
auth_username='application-name'
auth_password='password'

# 用户默认密码
password='daodaotest'

def addUser(name,displayName,email):
  """
  添加单用户

  :param name: 登录用户,建议拼音全称,如:jiangliheng
  :param displayName: 显示名称,建议中文全称,如:蒋李恒
  :param email: 邮箱地址
  :return: status_code 状态码,text 响应报文信息
  """

  # 请求 json 数据
  data = '{ \
    "name" :"' + name + '", \
    "email" : "' + email + '", \
    "active" : true, \
    "first-name" : "' + displayName + '", \
    "last-name" : "' + displayName + '", \
    "display-name" : "'+ displayName + '", \
    "password" : { \
      "value" : "' + password + '" \
    } \
  }'

  # 发起请求
  # 解决中文乱码问题 data.encode("utf-8").decode("latin1")
  response = requests.post(
    base_url + '/crowd/rest/usermanagement/1/user',
    headers=headers,
    auth=HTTPBasicAuth(auth_username,auth_password),
    data=data.encode("utf-8").decode("latin1")
  )

  # 状态码
  status_code=response.status_code
  # 响应报文信息
  text=response.text

  # 状态判断
  if str(status_code).startswith("2"):
    print("%s 用户添加成功,状态码:%s ,响应报文信息:%s" % (name,status_code,text))
  else:
    print("%s 用户添加失败,状态码:%s ,响应报文信息:%s" % (name,status_code,text))

  # 返回 状态码,响应报文信息
  return status_code,text

def addGroup(username,groupname):
  """
  用户添加到组

  :param username: 登录用户,建议拼音全称,如:jiangliheng
  :param groups: 用户组,用逗号隔开,如:bitbucket-users,bamboo-users
  :return: status_code 状态码,text 响应报文信息
  """

  # 请求 json 数据
  data = '{ \
    "name" :"' + groupname + '" \
  }'

  # 发起请求
  response = requests.post(
    base_url + '/crowd/rest/usermanagement/1/user/group/direct?username='+username,
    headers=headers,
    auth=HTTPBasicAuth(auth_username,auth_password),
    data=data
  )

  # 状态码
  status_code=response.status_code
  # 响应报文信息
  text=response.text

  # 状态判断
  if str(status_code).startswith("2"):
    print("%s 用户添加组 %s 成功,状态码:%s ,响应报文信息:%s" % (username,groupname,status_code,text))
  else:
    print("%s 用户添加组 %s 失败,状态码:%s ,响应报文信息:%s" % (username,groupname,status_code,text))

  # 返回 状态码,响应报文信息
  return status_code,text

def addUserByCsv(csvfile):
  """
  通过 CSV 文件批量添加用户,并加到组

  :param filename: Crowd 用户 csv 文件
  """

  # 批量读取 csv 的用户
  with open(csvfile, 'r', encoding='utf-8') as f:
    fieldnames = ("name", "displayName", "email")
    reader = csv.DictReader(f, fieldnames)

    for row in islice(reader, 1, None):
      print("批量添加用户 %s" % (row["name"]))
      # 添加用户
      addUser(row["name"],row["displayName"],row["email"])
      # 添加多个组
      addGroup(row["name"],"all-users")
      addGroup(row["name"],"bitbucket-users")
      addGroup(row["name"],"confluence-users")
      addGroup(row["name"],"jira-software-users")
      addGroup(row["name"],"sonar-users")

    f.close()

def main():
  # 通过 CSV 文件批量添加用户,并加到组
  addUserByCsv("crowdUsers.csv")

  # 添加单用户
  # addUser("daodaotest","叨叨软件测试","daodaotest@daodaotest.com")

  # 添加用户到组
  # addGroup("daodaotest","all-users")

if __name__ == "__main__":
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
python实现批量修改服务器密码的方法
Aug 13 Python
python3.6生成器yield用法实例分析
Aug 23 Python
python应用文件读取与登录注册功能
Sep 23 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 #Python
django中related_name的用法说明
May 20 #Python
在django中form的label和verbose name的区别说明
May 20 #Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 #Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 #Python
如何在sublime编辑器中安装python
May 20 #Python
Django 解决distinct无法去除重复数据的问题
May 20 #Python
You might like
php生成静态页面的简单示例
2014/04/17 PHP
PHP return语句的另一个作用
2014/07/30 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
CSS和Javascript简单复习资料
2010/06/29 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
教师演讲稿范文
2014/01/08 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
庆祝国庆节标语
2014/10/09 职场文书
体育个人工作总结
2015/02/09 职场文书
旷工辞退通知书
2015/04/17 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
创业计划书之养殖业
2019/10/11 职场文书
《围炉夜话》110句人生箴言,精辟有内涵,引人深思
2019/10/23 职场文书
vue+echarts实现多条折线图
2022/03/21 Vue.js