2014-09-26 01:01:01 +00:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
# (c) 2013, Phillip Gentry <phillip@cx.com>
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
2017-03-14 16:07:22 +00:00
ANSIBLE_METADATA = { ' metadata_version ' : ' 1.0 ' ,
' status ' : [ ' preview ' ] ,
' supported_by ' : ' community ' }
2016-12-06 10:35:25 +00:00
2014-09-26 01:01:01 +00:00
DOCUMENTATION = '''
- - -
module : github_hooks
short_description : Manages github service hooks .
description :
- Adds service hooks and removes service hooks that have an error status .
version_added : " 1.4 "
options :
user :
description :
- Github username .
required : true
oauthkey :
description :
- The oauth key provided by github . It can be found / generated on github under " Edit Your Profile " >> " Applications " >> " Personal Access Tokens "
required : true
repo :
description :
- " This is the API url for the repository you want to manage hooks for. It should be in the form of: https://api.github.com/repos/user:/repo:. Note this is different than the normal repo url. "
required : true
hookurl :
description :
- When creating a new hook , this is the url that you want github to post to . It is only required when creating a new hook .
required : false
action :
description :
- This tells the githooks module what you want it to do .
required : true
2016-05-02 17:21:02 +00:00
choices : [ " create " , " cleanall " , " list " , " clean504 " ]
2014-09-26 01:01:01 +00:00
validate_certs :
description :
- If C ( no ) , SSL certificates for the target repo will not be validated . This should only be used
on personally controlled sites using self - signed certificates .
required : false
default : ' yes '
choices : [ ' yes ' , ' no ' ]
2014-09-29 13:35:04 +00:00
content_type :
description :
- Content type to use for requests made to the webhook
required : false
default : ' json '
choices : [ ' json ' , ' form ' ]
2014-09-26 01:01:01 +00:00
2015-06-16 18:32:39 +00:00
author : " Phillip Gentry, CX Inc (@pcgentry) "
2014-09-26 01:01:01 +00:00
'''
EXAMPLES = '''
# Example creating a new service hook. It ignores duplicates.
2016-12-01 12:30:04 +00:00
- github_hooks :
action : create
2016-12-10 14:23:19 +00:00
hookurl : http : / / 11.111 .111 .111 : 2222
2016-12-01 12:30:04 +00:00
user : ' {{ gituser }} '
oauthkey : ' {{ oauthkey }} '
2016-12-10 14:23:19 +00:00
repo : https : / / api . github . com / repos / pcgentry / Github - Auto - Deploy
2014-09-26 01:01:01 +00:00
# Cleaning all hooks for this repo that had an error on the last update. Since this works for all hooks in a repo it is probably best that this would be called from a handler.
2016-12-01 12:30:04 +00:00
- github_hooks :
action : cleanall
user : ' {{ gituser }} '
oauthkey : ' {{ oauthkey }} '
repo : ' {{ repo }} '
delegate_to : localhost
2014-09-26 01:01:01 +00:00
'''
2017-02-02 19:45:22 +00:00
try :
import json
except ImportError :
try :
import simplejson as json
except ImportError :
# Let snippet from module_utils/basic.py return a proper error in this case
pass
import base64
2014-09-30 07:07:40 +00:00
def _list ( module , hookurl , oauthkey , repo , user ) :
2014-09-26 01:01:01 +00:00
url = " %s /hooks " % repo
auth = base64 . encodestring ( ' %s : %s ' % ( user , oauthkey ) ) . replace ( ' \n ' , ' ' )
headers = {
' Authorization ' : ' Basic %s ' % auth ,
}
response , info = fetch_url ( module , url , headers = headers )
if info [ ' status ' ] != 200 :
return False , ' '
else :
return False , response . read ( )
2014-09-30 07:12:10 +00:00
def _clean504 ( module , hookurl , oauthkey , repo , user ) :
2014-09-30 07:07:40 +00:00
current_hooks = _list ( hookurl , oauthkey , repo , user ) [ 1 ]
2014-09-26 01:01:01 +00:00
decoded = json . loads ( current_hooks )
for hook in decoded :
if hook [ ' last_response ' ] [ ' code ' ] == 504 :
# print "Last response was an ERROR for hook:"
# print hook['id']
2014-09-30 07:12:10 +00:00
_delete ( module , hookurl , oauthkey , repo , user , hook [ ' id ' ] )
2017-01-27 23:45:23 +00:00
2014-09-26 01:01:01 +00:00
return 0 , current_hooks
2014-09-30 07:12:10 +00:00
def _cleanall ( module , hookurl , oauthkey , repo , user ) :
2014-09-30 07:07:40 +00:00
current_hooks = _list ( hookurl , oauthkey , repo , user ) [ 1 ]
2014-09-26 01:01:01 +00:00
decoded = json . loads ( current_hooks )
for hook in decoded :
if hook [ ' last_response ' ] [ ' code ' ] != 200 :
# print "Last response was an ERROR for hook:"
# print hook['id']
2014-09-30 07:12:10 +00:00
_delete ( module , hookurl , oauthkey , repo , user , hook [ ' id ' ] )
2017-01-27 23:45:23 +00:00
2014-09-26 01:01:01 +00:00
return 0 , current_hooks
2014-09-30 07:12:10 +00:00
def _create ( module , hookurl , oauthkey , repo , user , content_type ) :
2014-09-26 01:01:01 +00:00
url = " %s /hooks " % repo
values = {
" active " : True ,
" name " : " web " ,
" config " : {
" url " : " %s " % hookurl ,
2014-09-29 13:35:04 +00:00
" content_type " : " %s " % content_type
2014-09-26 01:01:01 +00:00
}
}
data = json . dumps ( values )
auth = base64 . encodestring ( ' %s : %s ' % ( user , oauthkey ) ) . replace ( ' \n ' , ' ' )
headers = {
' Authorization ' : ' Basic %s ' % auth ,
}
response , info = fetch_url ( module , url , data = data , headers = headers )
if info [ ' status ' ] != 200 :
return 0 , ' [] '
else :
return 0 , response . read ( )
2014-09-30 07:12:10 +00:00
def _delete ( module , hookurl , oauthkey , repo , user , hookid ) :
2014-09-26 01:01:01 +00:00
url = " %s /hooks/ %s " % ( repo , hookid )
auth = base64 . encodestring ( ' %s : %s ' % ( user , oauthkey ) ) . replace ( ' \n ' , ' ' )
headers = {
' Authorization ' : ' Basic %s ' % auth ,
}
response , info = fetch_url ( module , url , data = data , headers = headers , method = ' DELETE ' )
return response . read ( )
def main ( ) :
module = AnsibleModule (
argument_spec = dict (
2017-01-29 07:28:53 +00:00
action = dict ( required = True , choices = [ ' list ' , ' clean504 ' , ' cleanall ' , ' create ' ] ) ,
hookurl = dict ( required = False ) ,
oauthkey = dict ( required = True , no_log = True ) ,
repo = dict ( required = True ) ,
user = dict ( required = True ) ,
validate_certs = dict ( default = ' yes ' , type = ' bool ' ) ,
content_type = dict ( default = ' json ' , choices = [ ' json ' , ' form ' ] ) ,
2014-09-26 01:01:01 +00:00
)
)
action = module . params [ ' action ' ]
hookurl = module . params [ ' hookurl ' ]
oauthkey = module . params [ ' oauthkey ' ]
repo = module . params [ ' repo ' ]
user = module . params [ ' user ' ]
2014-09-29 13:35:04 +00:00
content_type = module . params [ ' content_type ' ]
2014-09-26 01:01:01 +00:00
if action == " list " :
2014-09-30 07:07:40 +00:00
( rc , out ) = _list ( module , hookurl , oauthkey , repo , user )
2014-09-26 01:01:01 +00:00
if action == " clean504 " :
2014-09-30 07:12:10 +00:00
( rc , out ) = _clean504 ( module , hookurl , oauthkey , repo , user )
2014-09-26 01:01:01 +00:00
if action == " cleanall " :
2014-09-30 07:12:10 +00:00
( rc , out ) = _cleanall ( module , hookurl , oauthkey , repo , user )
2014-09-26 01:01:01 +00:00
if action == " create " :
2014-09-30 07:12:10 +00:00
( rc , out ) = _create ( module , hookurl , oauthkey , repo , user , content_type )
2014-09-26 01:01:01 +00:00
if rc != 0 :
module . fail_json ( msg = " failed " , result = out )
module . exit_json ( msg = " success " , result = out )
# import module snippets
from ansible . module_utils . basic import *
from ansible . module_utils . urls import *
2016-12-05 16:23:23 +00:00
if __name__ == ' __main__ ' :
main ( )