├── README.md └── confluence.py /README.md: -------------------------------------------------------------------------------- 1 | # Confluence.py 2 | 3 | Simple python script to use a Atlassian Confluence Wiki via the CLI. 4 | 5 | ## Usage 6 | 7 | $ python confluence.py --help 8 | usage: confluence.py [-h] -w WIKIURL -u USERNAME -p PASSWORD 9 | {addpage,updatepage,listpages,removepage,getpagecontent,getpagesummary,listspaces,addspace,removespace,adduser,removeuser,deactivateuser,reactivateuser,changeuserpassword,addgroup,removegroup,listgroups,listusers,getallpages,addusertogroup,removeusergromgroup,listusergroups} 10 | ... 11 | 12 | Confluence wiki API 13 | 14 | positional arguments: 15 | {addpage,updatepage,listpages,removepage,getpagecontent,getpagesummary,listspaces,addspace,removespace,adduser,removeuser,deactivateuser,reactivateuser,changeuserpassword,addgroup,removegroup,listgroups,listusers,getallpages,addusertogroup,removeusergromgroup,listusergroups} 16 | addpage Add a page 17 | updatepage Update a page 18 | listpages List pages in one or all spaces 19 | removepage Remove a page 20 | getpagecontent Get page content 21 | getpagesummary Get page summary 22 | listspaces List all spaces 23 | addspace Add a space 24 | removespace Remove a space 25 | adduser Add a user 26 | removeuser Remove a user 27 | deactivateuser Deactivate a user 28 | reactivateuser Reactivate a user 29 | changeuserpassword Change user password 30 | addgroup Add a goup 31 | removegroup Remove a goup 32 | listgroups List all goup 33 | listusers List all users 34 | getallpages Save all pages to local files. 35 | addusertogroup Add user to a group 36 | removeusergromgroup 37 | Remove user from a group 38 | listusergroups List groups user is in 39 | 40 | optional arguments: 41 | -h, --help show this help message and exit 42 | -w WIKIURL, --wikiurl WIKIURL 43 | Wiki URL (only FQDN, no / and such) 44 | -u USERNAME, --username USERNAME 45 | Login Username 46 | -p PASSWORD, --password PASSWORD 47 | Login Password 48 | 49 | 50 | 51 | ## Examples 52 | 53 | Add page: 54 | 55 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" addpage -f ./content.txt -n "CLI New Page" -s "RAY" 56 | http://wiki.raymii.org/display/RAY/CLI+New+Page 57 | 58 | 59 | Remove Page: 60 | 61 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" removepage -n "CLI New Page" -s "RAY" 62 | 63 | 64 | Update Page: 65 | 66 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" updatepage -f ./content.txt -n "CLI New Page" -s "RAY" 67 | http://wiki.raymii.org/display/RAY/CLI+New+Page 68 | 69 | Get page content (HTML): 70 | 71 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" getpagecontent -n "CLI New Page" -s "RAY" 72 |

Table of Contents

73 |

74 |

Information

75 | 76 | Add Space: 77 | 78 | ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" addspace -n "New Space" -s "NS" 79 | 80 | Remove Space: 81 | 82 | ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" removespace -s "NS" 83 | 84 | List all spaces: 85 | 86 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" listspaces 87 | NS, New Space, http://wiki.raymii.org/display/NS 88 | ITS, IT Staff, http://wiki.raymii.org/display/ITS 89 | 90 | 91 | Add user: 92 | 93 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" adduser -U "newuser" -N "New user" -E "newuser@raymii.org" -X "password" 94 | 95 | Remove user: 96 | 97 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" removeuser -U newuser 98 | 99 | Deactivate user: 100 | 101 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" deactivateuser -U newuser 102 | 103 | Reactivate user: 104 | 105 | $ ./confluence.py --wikiurl="http://wiki.raymii.org" -u "api" -p "" reactivateuser -U newuser 106 | 107 | 108 | For more actions, run `./confluence.py -h` or see the usage section above. 109 | 110 | ## More info 111 | 112 | [Raymii.org](https://raymii.org) 113 | -------------------------------------------------------------------------------- /confluence.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # Copyright (C) 2013 Remy van Elst 3 | 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | import sys, xmlrpclib, argparse, string, logging 18 | 19 | # 20 | # Logging 21 | # 22 | 23 | logger = logging.getLogger(__name__.rpartition('.')[0]) 24 | logger.setLevel(logging.DEBUG) 25 | console_handler = logging.StreamHandler() 26 | console_handler.setLevel(logging.INFO) 27 | formatter = logging.Formatter('%(levelname)s: [%(name)s] %(message)s') 28 | console_handler.setFormatter(formatter) 29 | logger.addHandler(console_handler) 30 | 31 | class ConfluenceSpace(object): 32 | def __init__(self, token, server): 33 | self.server = server 34 | self.token = token 35 | 36 | def get_all(self): 37 | self.spaces = self.server.confluence2.getSpaces(self.token) 38 | return self.spaces 39 | 40 | def get_by_key(self,space_key): 41 | self.space_key = space_key 42 | self.space = self.server.confluence2.getSpace(self.token,self.space_key) 43 | return self.space 44 | 45 | def create(self,space_key,space_name): 46 | self.space_key = space_key 47 | self.space_name = space_name 48 | self.space_to_create = {"key":self.space_key,"name":self.space_name} 49 | self.server.confluence2.addSpace(self.token,self.space_to_create) 50 | return self.get_by_key(space_key) 51 | 52 | def remove(self,space_key): 53 | self.space_key = space_key 54 | self.server.confluence2.removeSpace(self.token,self.space_key) 55 | 56 | def get_all_pages(self,spaceKey): 57 | self.spacekey = spaceKey 58 | return self.server.confluence2.getPages(self.token, self.spacekey) 59 | 60 | class ConfluenceGroup(object): 61 | def __init__(self,token,server,groupname): 62 | self.server = server 63 | self.token = token 64 | self.groupname = groupname 65 | 66 | def get_all(self): 67 | return self.server.confluence2.getGroups(self.token) 68 | 69 | def add(self): 70 | self.server.confluence2.addGroup(self.token,self.groupname) 71 | 72 | def remove(self): 73 | self.server.confluence2.removeGroup(self.token,self.groupname,"confluence-users") 74 | 75 | class ConfluenceUser(object): 76 | def __init__(self,token,server,username): 77 | self.server = server 78 | self.token = token 79 | self.username = username 80 | 81 | def create(self,full_name,email,password): 82 | self.password = password 83 | self.email = email 84 | self.full_name = full_name 85 | self.user_to_create = {"name":self.username,"fullname":self.full_name,"email":self.email} 86 | self.server.confluence2.addUser(self.token,self.user_to_create,self.password) 87 | 88 | def get_info(self): 89 | return self.server.confluence2.getUser(self.token,self.username) 90 | 91 | def get_groups(self): 92 | return self.server.confluence2.getUserGroups(self.token,self.username) 93 | 94 | def remove(self): 95 | self.server.confluence2.removeUser(self.token,self.username) 96 | 97 | def deactivate(self): 98 | self.server.confluence2.deactivateUser(self.token,self.username) 99 | 100 | def reactivate(self): 101 | self.server.confluence2.reactivateUser(self.token,self.username) 102 | 103 | def add_to_group(self,group): 104 | self.group = group 105 | self.server.confluence2.addUserToGroup(self.token,self.username,self.group) 106 | 107 | def remove_from_group(self,group): 108 | self.group = group 109 | self.server.confluence2.removeUserFromGroup(self.token,self.username,self.group) 110 | 111 | def change_password(self,password): 112 | self.password = password 113 | self.server.confluence2.changeUserPassword(self.token,self.username,self.password) 114 | 115 | def get_all(self): 116 | return self.server.confluence2.getActiveUsers(self.token, True) 117 | 118 | class ConfluencePage(object): 119 | def __init__(self,token,server,name,spaceKey,content,page_id="",label=""): 120 | self.server = server 121 | self.token = token 122 | self.name = name 123 | self.spaceKey = spaceKey 124 | self.content = content 125 | self.label = label 126 | self.logger = logging.getLogger( 127 | __name__ + '.'+ self.__class__.__name__ 128 | ) 129 | self.logger.debug('Creating a new instance (name="{}", label="{}")'.format(name, label)) 130 | 131 | def add(self,parent_id=0,content=""): 132 | self.logger.debug("Add page '{}'; label = [{}]".format(self.name, self.label)) 133 | if content: 134 | self.content = content 135 | self.parent_id = parent_id 136 | self.newPost = {"title":self.name,"content":self.content,"space":self.spaceKey,"parentId":str(self.parent_id)} 137 | self.post_to_wiki = self.server.confluence2.storePage(self.token,self.newPost) 138 | self.created_page = self.server.confluence2.getPage(self.token, self.spaceKey, self.name) 139 | self.page_url = self.created_page["url"] 140 | self.page_id = self.created_page["id"] 141 | if self.label: 142 | self.set_label() 143 | return {"url": self.page_url, "id": self.page_id} 144 | 145 | def update(self,content,parent_id=0): 146 | self.remove() 147 | self.parent_id = parent_id 148 | self.add(str(parent_id),content) 149 | 150 | def get(self): 151 | self.wanted_page = self.server.confluence2.getPage(self.token, self.spaceKey, self.name) 152 | return self.wanted_page 153 | 154 | def get_content(self): 155 | self.wanted_page_id = self.get_page_id 156 | self.content_values = {"style": "clean"} 157 | self.page_content = self.wanted_page = self.server.confluence2.renderContet(self.token, self.wanted_page_id,self.content_values) 158 | return self.page_content 159 | 160 | 161 | def get_id(self): 162 | return self.get()['id'] 163 | 164 | def get_content(self): 165 | return self.get()['content'] 166 | 167 | def remove(self): 168 | self.page = self.server.confluence2.getPage(self.token, self.spaceKey, self.name) 169 | self.server.confluence2.removePage(self.token, self.page["id"]) 170 | 171 | def set_label(self): 172 | self.page_id = self.get_id() 173 | self.logger.debug("Set label '{}' on page {}".format( 174 | self.label, self.page_id)) 175 | if not self.server.confluence2.addLabelByName(self.token, self.label, self.page_id): 176 | self.logger.debug("Unable to set label '{}' on page ID {}".format( 177 | self.label, self.page_id)) 178 | 179 | def get_content(self): 180 | return self.get()['content'] 181 | 182 | def get_version(self): 183 | return self.get()['version'] 184 | 185 | class ConfluenceAuth(object): 186 | def __init__(self,server,username,password): 187 | self.server = server 188 | self.username = username 189 | self.password = password 190 | 191 | def login(self): 192 | self.token = self.server.confluence2.login(self.username, self.password) 193 | return self.token 194 | 195 | def error_out(error_message): 196 | print("Error: ") 197 | print(error_message) 198 | exit() 199 | 200 | def Parser(): 201 | parser = argparse.ArgumentParser(description="Confluence wiki API") 202 | parser.add_argument("-w", "--wikiurl", help="Wiki URL (only FQDN, no / and such)", required=True) 203 | parser.add_argument("-u", "--username", help="Login Username", required=True) 204 | parser.add_argument("-p", "--password", help="Login Password", required=True) 205 | parser.add_argument("-v", "--verbose", help="Enable debug logging", action="store_true") 206 | subparsers = parser.add_subparsers(dest="action") 207 | 208 | parser_addpage = subparsers.add_parser('addpage', help='Add a page') 209 | parser_addpage.add_argument("-n", "--name", help="(New) page name", required=True) 210 | parser_addpage.add_argument("-P", "--parentpage", help="Parent page ID", default="0") 211 | parser_addpage.add_argument("-l", "--label", help="Page label", default="created_via_api") 212 | parser_addpage.add_argument("-s", "--spacekey", help="Space Key", required=True) 213 | files_addpage = parser_addpage.add_mutually_exclusive_group() 214 | files_addpage.add_argument("-f", "--file", help="Read content from this file") 215 | files_addpage.add_argument("-S", "--stdin", help="Read content from STDIN", action="store_true") 216 | 217 | parser_addpage = subparsers.add_parser('copypage', help='Copy a page') 218 | parser_addpage.add_argument("-n", "--name", help="(New) page name", required=True) 219 | parser_addpage.add_argument("-P", "--parentpage", help="Parent page ID", default="0") 220 | parser_addpage.add_argument("-l", "--label", help="Page label", default="created_via_api") 221 | parser_addpage.add_argument("-s", "--spacekey", help="Space Key", required=True) 222 | parser_addpage.add_argument("-o", "--origin", help="Origin page name", required=True) 223 | 224 | parser_updatepage = subparsers.add_parser('updatepage', help='Update a page') 225 | parser_updatepage.add_argument("-n", "--name", help="Page name", required=True) 226 | parser_updatepage.add_argument("-s", "--spacekey", help="Space Key", required=True) 227 | parser_updatepage.add_argument("-P", "--parentpage", help="Parent page ID", default="0") 228 | parser_updatepage.add_argument("-l", "--label", help="Page label", default="created_via_api") 229 | files_updatepage = parser_updatepage.add_mutually_exclusive_group() 230 | files_updatepage.add_argument("-f", "--file", help="Read content from this file") 231 | files_updatepage.add_argument("-S", "--stdin", help="Read content from STDIN", action="store_true") 232 | 233 | parser_listpages = subparsers.add_parser('listpages', help='List pages in one or all spaces') 234 | parser_listpages.add_argument("-s", "--spacekey", help="Space Key", default="") 235 | parser_listpages.add_argument("-d", "--delimiter", help="Field delimiter", default=", ") 236 | 237 | parser_removepage = subparsers.add_parser('removepage', help='Remove a page') 238 | parser_removepage.add_argument("-n", "--name", help="Page name", required=True) 239 | parser_removepage.add_argument("-s", "--spacekey", help="Space Key", required=True) 240 | 241 | parser_getpage = subparsers.add_parser('getpagecontent', help='Get page content') 242 | parser_getpage.add_argument("-n", "--name", help="Page name", required=True) 243 | parser_getpage.add_argument("-s", "--spacekey", help="Space Key", required=True) 244 | 245 | parser_getpagesummary = subparsers.add_parser('getpagesummary', help='Get page summary') 246 | parser_getpagesummary.add_argument("-s", "--spacekey", help="Space Key", required=True) 247 | parser_getpagesummary.add_argument("-n", "--name", help="Page name", required=True) 248 | parser_getpagesummary.add_argument("-d", "--delimiter", help="Field delimiter", default=", ") 249 | 250 | parser_listspaces = subparsers.add_parser('listspaces', help='List all spaces') 251 | 252 | parser_addspace = subparsers.add_parser('addspace', help='Add a space') 253 | parser_addspace.add_argument("-s", "--spacekey", help="Space Key", required=True) 254 | parser_addspace.add_argument("-D", "--description", help="Space description", required=True) 255 | 256 | parser_removespace = subparsers.add_parser('removespace', help='Remove a space') 257 | parser_removespace.add_argument("-s", "--spacekey", help="Space Key", required=True) 258 | 259 | parser_adduser = subparsers.add_parser('adduser', help='Add a user') 260 | parser_adduser.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 261 | parser_adduser.add_argument("-N", "--fullname", help="Full name for new user", required=True) 262 | parser_adduser.add_argument("-E", "--email", help="Email address for new user", required=True) 263 | parser_adduser.add_argument("-X", "--userpassword", help="Password for new user", required=True) 264 | 265 | parser_removeuser = subparsers.add_parser('removeuser', help='Remove a user') 266 | parser_removeuser.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 267 | 268 | parser_deactuser = subparsers.add_parser('deactivateuser', help='Deactivate a user') 269 | parser_deactuser.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 270 | 271 | parser_reactuser = subparsers.add_parser('reactivateuser', help='Reactivate a user') 272 | parser_reactuser.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 273 | 274 | parser_changepass = subparsers.add_parser('changeuserpassword', help='Change user password') 275 | parser_changepass.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 276 | parser_changepass.add_argument("-X", "--userpassword", help="Password for user", required=True) 277 | 278 | parser_addgroup = subparsers.add_parser('addgroup', help='Add a goup') 279 | parser_addgroup.add_argument("-G", "--groupname", help="Group name to perform action on.", required=True) 280 | 281 | parser_removegroup = subparsers.add_parser('removegroup', help='Remove a goup') 282 | parser_removegroup.add_argument("-G", "--groupname", help="Group name to perform action on.", required=True) 283 | 284 | parser_listgroups = subparsers.add_parser('listgroups', help='List all goup') 285 | 286 | parser_usersgroups = subparsers.add_parser('listusers', help='List all users') 287 | 288 | parser_allpages = subparsers.add_parser('getallpages', help='Save all pages to local files.') 289 | 290 | parser_addutog = subparsers.add_parser('addusertogroup', help='Add user to a group') 291 | parser_addutog.add_argument("-G", "--groupname", help="Group name to perform action on.", required=True) 292 | parser_addutog.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 293 | 294 | parser_removeufromg = subparsers.add_parser('removeusergromgroup', help='Remove user from a group') 295 | parser_removeufromg.add_argument("-G", "--groupname", help="Group name to perform action on.", required=True) 296 | parser_removeufromg.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 297 | 298 | parser_listusergroups = subparsers.add_parser('listusergroups', help='List groups user is in') 299 | parser_listusergroups.add_argument("-U", "--newusername", help="Username to perform action on.", required=True) 300 | 301 | args = parser.parse_args() 302 | return args 303 | 304 | def Content(args): 305 | if not hasattr(args, 'file') or not hasattr(args, 'stdin'): 306 | content = "" 307 | elif args.file: 308 | try: 309 | content = open(args.file, 'rb').read() 310 | except: 311 | error = "Cannot open file: ", args.file 312 | raise 313 | elif args.stdin: 314 | content = sys.stdin.read() 315 | else: 316 | content = "" 317 | return content 318 | 319 | def Connect(args): 320 | wiki_url = args.wikiurl + "/rpc/xmlrpc" 321 | xml_server = xmlrpclib.Server(wiki_url) 322 | try: 323 | token = ConfluenceAuth(xml_server,args.username,args.password).login() 324 | except xmlrpclib.Fault as err: 325 | error_out("%d: %s" % ( err.faultCode, err.faultString)) 326 | return {"token":token,"xml_server":xml_server} 327 | 328 | def Actions(token,xml_server,args,content): 329 | try: 330 | if args.action == "addpage": 331 | logger.debug('Command: "addpage", args.name = "{}", args.label = "{}"'.format( 332 | args.name, args.label)) 333 | new_page = ConfluencePage( 334 | token,xml_server,args.name,args.spacekey,content,label=args.label) 335 | new_page.add(args.parentpage) 336 | print(new_page.get()["url"]) 337 | elif args.action == "copypage": 338 | content = ConfluencePage(token,xml_server,args.origin,args.spacekey,content).get_content() 339 | copy_page = ConfluencePage( 340 | token,xml_server,args.name,args.spacekey,content,label=args.label) 341 | copy_page.add(args.parentpage) 342 | print(copy_page.get()["url"]) 343 | elif args.action == "updatepage": 344 | update_page = ConfluencePage(token,xml_server,args.name,args.spacekey,content,args.parentpage,label=args.label) 345 | update_page.update(content,args.parentpage) 346 | update_page.set_label() 347 | print(update_page.get()['url']) 348 | 349 | elif args.action == "getpagecontent": 350 | get_page = ConfluencePage(token,xml_server,args.name,args.spacekey,content).get_content() 351 | print(get_page) 352 | 353 | elif args.action == "getpagesummary": 354 | page = ConfluencePage(token,xml_server,args.name,args.spacekey,content).get() 355 | print args.delimiter.join(( 356 | page['id'], page['space'], page['parentId'], page['title'], page['url'])) 357 | 358 | elif args.action == "listpages": 359 | if args.spacekey == "": 360 | spaces = ConfluenceSpace(token,xml_server).get_all() 361 | else: 362 | spaces = [ConfluenceSpace(token,xml_server).get_by_key(args.spacekey)] 363 | for space in spaces: 364 | all_pages = ConfluenceSpace(token,xml_server).get_all_pages(space['key']) 365 | for page in all_pages: 366 | print args.delimiter.join(( 367 | page['id'], page['space'], page['parentId'], page['title'], page['url'])) 368 | 369 | elif args.action == "removepage": 370 | removed_page = ConfluencePage(token,xml_server,args.name,args.spacekey,"").remove() 371 | 372 | elif args.action == "addspace": 373 | add_space = ConfluenceSpace(token,xml_server).create(args.spacekey,args.name) 374 | 375 | elif args.action == "removespace": 376 | remove_space = ConfluenceSpace(token,xml_server).remove(args.spacekey) 377 | 378 | elif args.action == "listspaces": 379 | all_spaces = ConfluenceSpace(token,xml_server).get_all() 380 | for space in all_spaces: 381 | print(("%s, %s, %s") % ( 382 | space['key'], space['name'], space['url'])) 383 | 384 | elif args.action == "getallpages": 385 | all_spaces = ConfluenceSpace(token,xml_server).get_all() 386 | for space in all_spaces: 387 | all_pages = ConfluenceSpace(token,xml_server).get_all_pages(space['key']) 388 | print("Saving space: %s" % space['name']) 389 | print("------------") 390 | for page in all_pages: 391 | page_content = ConfluencePage(token,xml_server,page['title'],space['key'],"").get_content() 392 | valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits) 393 | page_filename = space['key'] + "_" + page['title'] + ".html" 394 | page_filename = ''.join(c for c in page_filename if c in valid_chars) 395 | with open(page_filename, "w") as page_file: 396 | try: 397 | page_file.write(page_content) 398 | page_file.close() 399 | print("Saved page: %s" % page_filename) 400 | except IOError: 401 | error_out('Could not write file: %s' % page['title']) 402 | 403 | elif args.action == "adduser": 404 | add_user = ConfluenceUser(token,xml_server,args.newusername).create(args.fullname,args.email,args.userpassword) 405 | 406 | elif args.action == "removeuser": 407 | remove_user = ConfluenceUser(token,xml_server,args.newusername).remove() 408 | 409 | elif args.action == "deactivateuser": 410 | deactivate_user = ConfluenceUser(token,xml_server,args.newusername).deactivate() 411 | 412 | elif args.action == "reactivateuser": 413 | reactivate_user = ConfluenceUser(token,xml_server,args.newusername).reactivate() 414 | 415 | elif args.action == "changeuserpassword": 416 | change_pass = ConfluenceUser(token,xml_server,args.newusername).change_password(args.userpassword) 417 | 418 | elif args.action == "listuserinfo": 419 | user_info = ConfluenceUser(token,xml_server,args.newusername).get_info() 420 | for key,value in user_info.items(): 421 | print(("%s: %s") % (key,value)) 422 | 423 | elif args.action == "addgroup": 424 | add_group = ConfluenceGroup(token,xml_server,args.groupname).add() 425 | 426 | elif args.action == "removegroup": 427 | remove_group = ConfluenceGroup(token,xml_server,args.groupname).remove() 428 | 429 | elif args.action == "addusertogroup": 430 | add_user_to_group = ConfluenceUser(token,xml_server,args.newusername).add_to_group(args.groupname) 431 | 432 | elif args.action == "removeuserfromgroup": 433 | remove_user_from_group = ConfluenceUser(token,xml_server,args.newusername).remove_from_group(args.groupname) 434 | 435 | elif args.action == "listgroups": 436 | allgroups = ConfluenceGroup(token,xml_server,"users").get_all() 437 | for group in allgroups: 438 | print(group) 439 | 440 | elif args.action == "listusers": 441 | allusers = ConfluenceUser(token,xml_server,"users").get_all() 442 | for user in allusers: 443 | print(user) 444 | 445 | elif args.action == "listusergroups": 446 | user_groups = ConfluenceUser(token,xml_server,args.newusername).get_groups() 447 | for group in user_groups: 448 | print(group) 449 | 450 | except xmlrpclib.Fault as err: 451 | print(("Error: %d: %s") % (err.faultCode, err.faultString)) 452 | 453 | def main(): 454 | args = Parser() 455 | 456 | if args.verbose: 457 | console_handler.setLevel(logging.DEBUG) 458 | 459 | content = Content(args) 460 | server = Connect(args) 461 | Actions(server["token"],server["xml_server"],args,content) 462 | 463 | if __name__ == '__main__': 464 | main() 465 | --------------------------------------------------------------------------------