1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
| #!/usr/bin/env python
# Made by Pierre Mavro 14/03/2012
# Version : 0.1
# This script permit to automate in a non secure way, new packages for a custom repository on Red Hat Satellite
# Require : pexpect
import getopt, os, sys, glob, pexpect
from string import Template
# Help
cmd_name = sys.argv[0]
def help(code):
print cmd_name, "[-h] [-r] [-s] [-l] [-p] [-d]"
str = """
-h, --help
Show this help
-s, --passphrase
Passphrase to sign packages
-r, --repository
Select wished repository to push the packages
-l, --login
Red Hat Network username
-p, --password
Red Hat Network password
-f, --folder
folder were new packages should be added (default: /tmp/packages)
-d, --debug
Debug mode
"""
print str
sys.exit(code)
class bcolors:
OK = '\033[92m'
FAIL = '\033[91m'
END = '\033[0m'
def disable(self):
self.OK = ''
self.FAIL = ''
self.END = ''
# Sign and push function
def sign_push(passphrase,repository,login,password,folder,debug):
# Package signing
def sign(rpm_files,passphrase,folder,debug,charspacing):
if (debug == 1): print 80*'=' + "\n"
print '[+] Signing packages :'
# Sign all packages
for package in rpm_files:
# Formating
charspace = Template("{0:<$space}")
print charspace.substitute(space = charspacing).format(' - ' + package + '...'),
# Launch resign
child = pexpect.spawn('rpm --resign ' + package)
if (debug == 1): child.logfile = sys.stdout
child.expect ('Enter pass phrase|Entrez la phrase de passe')
child.sendline (passphrase)
if (debug == 1): child.logfile = sys.stdout
child.expect(pexpect.EOF)
child.close()
# Check return status
if (child.exitstatus == 0):
print '[ ' + bcolors.OK + 'OK' + bcolors.END + ' ] '
else:
print '[ ' + bcolors.FAIL + 'FAIL' + bcolors.END + ']'
# Package push
def push(rpm_files,repository,login,password,folder,debug,charspacing):
if (debug == 1): print 80*'=' + "\n"
print '[+] Adding packages to satellite server :'
for package in rpm_files:
# Formating
charspace = Template("{0:<$space}")
print charspace.substitute(space = charspacing).format(' - ' + package + '...'),
# RPM push command
child = pexpect.spawn('rhnpush --force --no-cache -c ' + repository + ' ' + package)
if (debug == 1): child.logfile = sys.stdout
child.expect ('Red Hat Network username')
child.sendline (login)
child.expect ('Red Hat Network password')
child.sendline (password)
if (debug == 1): child.logfile = sys.stdout
child.expect(pexpect.EOF)
child.close()
# Check return status
if (child.exitstatus == 0):
print '[ ' + bcolors.OK + 'OK' + bcolors.END + ' ] '
else:
print '[ ' + bcolors.FAIL + 'FAIL' + bcolors.END + ' ]'
# Get rpm files list
rpm_files=glob.glob(folder + '/*.rpm')
if (debug == 1): print 80*'=' + "\n" + 'RPM found :'
if (debug == 1): print rpm_files
# Check if RPM were found
if (len(rpm_files) == 0):
print "No RPM were found in " + folder
sys.exit(2)
# Get maximum rpm size for visual answers (OK/FAIL)
charspacing=0
for package in rpm_files:
count = len(package)
if (count > charspacing):
charspacing=count
charspacing += 10
# Sign packages
sign(rpm_files,passphrase,folder,debug,charspacing)
# Push packages
push(rpm_files,repository,login,password,folder,debug,charspacing)
# Main
def main(argv):
try:
opts, args = getopt.getopt(argv, 'hs:r:l:p:f:d', ["passphrase=","repository=","login=","password=","folder=","help"])
except getopt.GetoptError:
# Print help and exit
print "Unknow option, bad or missing argument\n"
help(2)
# Initialize vars
# GPG passphrase for package sign in
passphrase=None
repository=None
login=None
password=None
folder='/tmp/'
debug=0
# Check opts
for opt, arg in opts:
if opt in ("-h", "--help"):
help(0)
sys.exit(0)
elif opt in ("-s", "--passphrase"):
passphrase = str(arg)
elif opt in ("-r", "--repository"):
repository=str(arg)
elif opt in ("-l", "--login"):
login=str(arg)
elif opt in ("-p", "--password"):
password=str(arg)
elif opt in ("-f", "--folder"):
folder=str(arg)
elif opt in ("-d", "--debug"):
debug=1
else:
print "Unknow option, please see usage\n"
help(2)
# Checks
if (passphrase or repository or login or password) is None:
print "Unknow option, please see usage\n"
help(2)
sign_push(passphrase,repository,login,password,folder,debug)
if __name__ == "__main__":
main(sys.argv[1:])
|