From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga ./clustermon.spec.in.in ./conga.spec.in. ...
Date: 13 Aug 2007 19:06:47 -0000 [thread overview]
Message-ID: <20070813190647.923.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Branch: RHEL5
Changes by: rmccabe at sourceware.org 2007-08-13 19:06:44
Modified files:
. : clustermon.spec.in.in conga.spec.in.in
luci/site/luci/var: Data.fs
luci/utils : luci_admin
Log message:
- Update the luci zope database file
- Update the changelog
- Fix some nits in the luci_admin script that were hit by users in the field
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/clustermon.spec.in.in.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.18.2.22&r2=1.18.2.23
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/conga.spec.in.in.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.45.2.52&r2=1.45.2.53
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/var/Data.fs.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.15.2.21&r2=1.15.2.22
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/utils/luci_admin.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.50.2.4&r2=1.50.2.5
--- conga/clustermon.spec.in.in 2007/08/08 21:24:12 1.18.2.22
+++ conga/clustermon.spec.in.in 2007/08/13 19:06:01 1.18.2.23
@@ -195,7 +195,7 @@
%changelog
* Wed Aug 08 2007 Ryan McCabe <rmccabe@redhat.com> 0.10.0-4
- Fixed bz230451 (fence_xvm.key file is not automatically created. Should have a least a default)
-- Related bz230451
+- Resolves: bz230451
* Mon Jul 30 2007 Ryan McCabe <rmccabe@redhat.com> 0.10.0-3
- Fixed bz249351 (conga reports that ricci agent is unresponsive even though it's running)
--- conga/conga.spec.in.in 2007/08/11 04:16:19 1.45.2.52
+++ conga/conga.spec.in.in 2007/08/13 19:06:01 1.45.2.53
@@ -310,9 +310,12 @@
### changelog ###
%changelog
-* Wed Aug 08 2007 Ryan McCabe <rmccabe@redhat.com> 0.10.0-4
+* Mon Aug 13 2007 Ryan McCabe <rmccabe@redhat.com> 0.10.0-4
- Fixed bz230451 (fence_xvm.key file is not automatically created. Should have a least a default)
-- Resolves bz230451
+- Fixed bz249097 (allow a space as a valid password char)
+- Fixed bz250834 (ZeroDivisionError when attempting to click an empty lvm volume group)
+- Resolves: bz249097
+- Related: bz230451
* Mon Jul 30 2007 Ryan McCabe <rmccabe@redhat.com> 0.10.0-3
- Fixed bz245947 (luci/Conga cluster configuration tool not initializing cluster node members)
Binary files /cvs/cluster/conga/luci/site/luci/var/Data.fs 2007/08/08 22:42:56 1.15.2.21 and /cvs/cluster/conga/luci/site/luci/var/Data.fs 2007/08/13 19:06:02 1.15.2.22 differ
rcsdiff: /cvs/cluster/conga/luci/site/luci/var/Data.fs: diff failed
--- conga/luci/utils/luci_admin 2007/08/10 18:32:54 1.50.2.4
+++ conga/luci/utils/luci_admin 2007/08/13 19:06:44 1.50.2.5
@@ -2,13 +2,13 @@
# Copyright (C) 2006-2007 Red Hat, Inc.
-import sys, os, stat, select, string, pwd
-from sys import stderr, argv
+import sys, os, pwd
+from select import select
+from stat import S_ISREG
import types
import xml
import xml.dom
-from xml.dom import minidom
-
+
sys.path.extend((
'/usr/lib/luci/zope/lib/python',
'/usr/lib/luci/zope/lib/python/Products',
@@ -25,14 +25,14 @@
))
from Products import __path__
-for i in ['/usr/lib/luci/zope/lib/python/Products',
+for pdir in ['/usr/lib/luci/zope/lib/python/Products',
'/usr/lib64/luci/zope/lib/python/Products',
'/usr/lib64/luci/zope/lib64/python/Products',
'/usr/lib64/zope/lib/python/Products',
'/usr/lib64/zope/lib64/python/Products',
'/usr/lib/zope/lib/python/Products']:
- if os.path.isdir(i):
- __path__.append(i)
+ if os.path.isdir(pdir):
+ __path__.append(pdir)
LUCI_INIT_DEBUG = 0
@@ -59,6 +59,12 @@
SSL_HTTPS_PUBKEY_PATH = LUCI_CERT_DIR + SSL_HTTPS_PUBKEY_NAME
SSL_KEYCONFIG_PATH = LUCI_CERT_DIR + SSL_KEYCONFIG_NAME
+# only root should run this
+if os.getuid() != 0:
+ sys.stderr.write('Only the \'root\' user can run %s\n' % sys.argv[0])
+ sys.stderr.write('Try again with root privileges.\n')
+ sys.exit(2)
+
ssl_key_data = [
{ 'id' : SSL_PRIVKEY_PATH,
'name': SSL_PRIVKEY_NAME,
@@ -81,12 +87,14 @@
'type': 'config',
'mode': 0644 }
]
+
for name in os.listdir(LUCI_PEERS_DIR):
- path = LUCI_PEERS_DIR + name
- if stat.S_ISREG(os.stat(path).st_mode):
- ssl_key_data.append({'id' : path,
- 'name' : path.lstrip(LUCI_CERT_DIR),
- 'type' : 'public',
+ cert_path = LUCI_PEERS_DIR + name
+ if S_ISREG(os.stat(cert_path).st_mode):
+ ssl_key_data.append({
+ 'id' : cert_path,
+ 'name' : cert_path.lstrip(LUCI_CERT_DIR),
+ 'type' : 'public',
'mode' : 0644})
#null = file(os.devnull, 'rwb+', 0) - available on python 2.4 and above!!!
@@ -109,21 +117,42 @@
raise
return luci
except:
- msg = 'Cannot find the \"' + LUCI_USER + '\" user.\n'
+ msg = 'Cannot find the "%s" user.\n' % LUCI_USER
sys.stderr.write(msg)
- raise msg
-
+ raise Exception, msg
+
def set_default_passwd_reset_flag():
# set flag marking admin password has been set
- uid, gid = get_luci_uid_gid()
- open(LUCI_ADMIN_SET_PATH, 'w').write('True')
+
+ try:
+ uid, gid = get_luci_uid_gid()
+ except:
+ sys.stderr.write('Unable to find the luci user\'s UID\n')
+ return False
+
+ try:
+ open(LUCI_ADMIN_SET_PATH, 'w').write('True')
+ except IOError, e:
+ if e[0] != 2:
+ sys.stderr.write('Unable to open "%s" for writing: %s\n' \
+ % (LUCI_ADMIN_SET_PATH, e[1]))
+ return False
+ except Exception, e:
+ sys.stderr.write('Unable to open "%s" for writing: %s\n' \
+ % (LUCI_ADMIN_SET_PATH, str(e)))
+ return False
+
os.chown(LUCI_ADMIN_SET_PATH, uid, gid)
os.chmod(LUCI_ADMIN_SET_PATH, 0640)
return True
def get_default_passwd_reset_flag():
- return open(LUCI_ADMIN_SET_PATH, 'r').read(16).strip() == 'True'
+ try:
+ return open(LUCI_ADMIN_SET_PATH, 'r').read(16).strip() == 'True'
+ except:
+ return False
+ return False
def read_passwd(prompt, confirm_prompt):
@@ -138,7 +167,7 @@
continue
s2 = getpass(confirm_prompt)
if s1 != s2:
- print 'Passwords mismatch, try again'
+ print 'Password mismatch, try again'
continue
return s1
@@ -146,41 +175,37 @@
def restore_luci_db_fsattr():
uid, gid = -1, -1
+
try:
uid, gid = get_luci_uid_gid()
except:
return -1
-
+
try:
os.chown(LUCI_DB_PATH, uid, gid)
os.chmod(LUCI_DB_PATH, 0600)
- for i in [ '.tmp', '.old', '.index', '.lock' ]:
+
+ for fext in [ '.tmp', '.old', '.index', '.lock' ]:
try:
- os.chown(LUCI_DB_PATH + i, uid, gid)
- os.chmod(LUCI_DB_PATH + i, 0600)
- except: pass
- except:
- sys.stderr.write('Unable to change ownership of the Luci database back to user \"' + LUCI_USER + '\"\n')
+ os.chown('%s%s' % (LUCI_DB_PATH, fext), uid, gid)
+ os.chmod('%s%s' % (LUCI_DB_PATH, fext), 0600)
+ except:
+ pass
+ except Exception, e:
+ sys.stderr.write('Unable to change ownership of the Luci database back to user "%s": %s\n' % (LUCI_USER, str(e)))
return -1
def set_zope_passwd(user, passwd):
sys.stderr = null
- import ZODB
from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
- import OFS
from OFS.Application import AppInitializer
- import OFS.Folder
import AccessControl
import AccessControl.User
from AccessControl.AuthEncoding import SSHADigestScheme
from AccessControl.SecurityManagement import newSecurityManager
import transaction
- import Products.CMFCore
- import Products.CMFCore.MemberDataTool
import App.ImageFile
- import Products.PluggableAuthService.plugins.ZODBUserManager
- import BTrees.OOBTree
# Zope wants to open a www/ok.gif and images/error.gif
# when you initialize the application object. This keeps
# the AppInitializer(app).initialize() call below from failing.
@@ -196,10 +221,10 @@
sys.stderr.write('It appears that Luci is running. Please stop Luci before attempting to reset passwords.\n')
return -1
else:
- sys.stderr.write('Unable to open the Luci database \"' + dbfn + '\":' + str(e) + '\n')
+ sys.stderr.write('Unable to open the Luci database \"' + LUCI_DB_PATH + '\":' + str(e) + '\n')
return -1
except Exception, e:
- sys.stderr.write('Unable to open the Luci database \"' + dbfn + '\":' + str(e) + '\n')
+ sys.stderr.write('Unable to open the Luci database \"' + LUCI_DB_PATH + '\":' + str(e) + '\n')
return -1
try:
@@ -238,10 +263,10 @@
if restore_luci_db_fsattr():
return -1
-
+
if user == 'admin' and ret == 0:
set_default_passwd_reset_flag()
-
+
return ret
@@ -254,6 +279,7 @@
if not certList or len(certList) < 1:
sys.stderr.write('Your backup file contains no certificate data. Please check that your backup file is not corrupt.\n')
return -1
+
uid, gid = -1, -1
try:
uid, gid = get_luci_uid_gid()
@@ -300,22 +326,14 @@
def luci_restore(argv):
sys.stderr = null
- import ZODB
from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
- import OFS
from OFS.Application import AppInitializer
- import OFS.Folder
import AccessControl
import AccessControl.User
- from AccessControl.AuthEncoding import SSHADigestScheme
from AccessControl.SecurityManagement import newSecurityManager
import transaction
- import Products.CMFCore
- import Products.CMFCore.MemberDataTool
import App.ImageFile
- import Products.PluggableAuthService.plugins.ZODBUserManager
- import BTrees.OOBTree
from DateTime import DateTime
App.ImageFile.__init__ = lambda x, y: None
sys.stderr = orig_stderr
@@ -497,7 +515,7 @@
try:
title = str(s.getAttribute('title'))
except:
- title = '__luci__:system'
+ title = ''
x.manage_addFolder(id, title)
try:
@@ -505,7 +523,8 @@
if not new_system:
raise
new_system.manage_acquiredPermissions([])
- new_system.manage_role('View', ['Access contents information','View'])
+ new_system.manage_role('View',
+ ['Access contents information', 'View'])
except:
transaction.abort()
sys.stderr.write('An error occurred while restoring storage system \"' + id + '\"\n')
@@ -556,7 +575,7 @@
title = c.getAttribute('title')
if not title:
- title = '__luci__:cluster'
+ title = ''
else:
title = str(title)
@@ -567,7 +586,8 @@
if not new_cluster:
raise
new_cluster.manage_acquiredPermissions([])
- new_cluster.manage_role('View', ['Access contents information','View'])
+ new_cluster.manage_role('View',
+ ['Access contents information', 'View'])
except:
transaction.abort()
sys.stderr.write('An error occurred while restoring the cluster \"' + id + '\"\n')
@@ -606,7 +626,7 @@
newsys = str(newsys)
stitle = i.getAttribute('title')
if not stitle:
- stitle = '__luci__:csystem:' + id
+ stitle = ''
else:
stitle = str(stitle)
@@ -616,7 +636,8 @@
if not newcs:
raise
newcs.manage_acquiredPermissions([])
- newcs.manage_role('View', ['Access contents information','View'])
+ newcs.manage_role('View',
+ ['Access contents information', 'View'])
except:
transaction.abort()
sys.stderr.write('An error occurred while restoring the storage system \"' + newsys + '\" for cluster \"' + id + '\"\n')
@@ -655,24 +676,24 @@
return 0
# This function's ability to work is dependent
-# upon the structure of @dict
-def dataToXML(doc, dict, tltag):
+# upon the structure of @obj_dict
+def dataToXML(doc, obj_dict, tltag):
node = doc.createElement(tltag)
- for i in dict:
- if isinstance(dict[i], types.DictType):
+ for i in obj_dict:
+ if isinstance(obj_dict[i], types.DictType):
if i[-4:] == 'List':
tagname = i
else:
tagname = tltag[:-4]
- temp = dataToXML(doc, dict[i], tagname)
+ temp = dataToXML(doc, obj_dict[i], tagname)
node.appendChild(temp)
- elif isinstance(dict[i], types.StringType) or isinstance(dict[i], types.IntType):
- node.setAttribute(i, str(dict[i]))
- elif isinstance(dict[i], types.ListType):
- if len(dict[i]) < 1:
+ elif isinstance(obj_dict[i], types.StringType) or isinstance(obj_dict[i], types.IntType):
+ node.setAttribute(i, str(obj_dict[i]))
+ elif isinstance(obj_dict[i], types.ListType):
+ if len(obj_dict[i]) < 1:
continue
temp = doc.createElement(i)
- for x in dict[i]:
+ for x in obj_dict[i]:
t = doc.createElement('ref')
t.setAttribute('name', x)
temp.appendChild(t.cloneNode(True))
@@ -681,23 +702,15 @@
def luci_backup(argv):
sys.stderr = null
- import ZODB
from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
- import OFS
from OFS.Application import AppInitializer
- import OFS.Folder
import AccessControl
import AccessControl.User
- from AccessControl.AuthEncoding import SSHADigestScheme
from AccessControl.SecurityManagement import newSecurityManager
import transaction
- import Products.CMFCore
- import Products.CMFCore.MemberDataTool
from CMFPlone.utils import getToolByName
import App.ImageFile
- import Products.PluggableAuthService.plugins.ZODBUserManager
- import BTrees.OOBTree
App.ImageFile.__init__ = lambda x, y: None
sys.stderr = orig_stderr
@@ -706,11 +719,6 @@
else:
dbfn = LUCI_DB_PATH
- if len(argv) > 1:
- backupfn = argv[1]
- else:
- backupfn = LUCI_BACKUP_PATH
-
try:
fs = FileStorage(dbfn)
db = DB(fs)
@@ -800,7 +808,7 @@
continue
except:
pass
-
+
try:
storagedir = app.luci.systems.storage
clusterdir = app.luci.systems.cluster
@@ -822,7 +830,7 @@
systems[i[0]]['permList'] = map(lambda x: x[0], filter(lambda x: len(x) > 1 and 'View' in x[1], roles.items()))
else:
systems[i[0]]['permList'] = {}
-
+
if clusterdir and len(clusterdir):
for i in clusterdir.objectItems():
cluster_name = i[0]
@@ -854,7 +862,7 @@
db.close()
fs.close()
- backup = {
+ backup_data = {
'userList': users,
'systemList': systems,
'clusterList': clusters
@@ -863,7 +871,7 @@
doc = xml.dom.minidom.Document()
luciData = doc.createElement('luci')
doc.appendChild(luciData)
- dataNode = dataToXML(doc, backup, 'backupData')
+ dataNode = dataToXML(doc, backup_data, 'backupData')
certList = doc.createElement('certificateList')
for i in ssl_key_data:
@@ -898,15 +906,16 @@
def _execWithCaptureErrorStatus(command, argv, searchPath = 0, root = '/', stdin = 0, catchfd = 1, catcherrfd = 2, closefd = -1):
if not os.access (root + command, os.X_OK):
- raise RuntimeError, command + " can not be run"
+ raise RuntimeError, '%s is not executable' % command
(read, write) = os.pipe()
- (read_err,write_err) = os.pipe()
+ (read_err, write_err) = os.pipe()
childpid = os.fork()
if (not childpid):
# child
- if (root and root != '/'): os.chroot (root)
+ if (root and root != '/'):
+ os.chroot (root)
if isinstance(catchfd, tuple):
for fd in catchfd:
os.dup2(write, fd)
@@ -943,7 +952,7 @@
rc_err = ""
in_list = [read, read_err]
while len(in_list) != 0:
- i,o,e = select.select(in_list, [], [], 0.1)
+ i, o, e = select(in_list, [], [], 0.1)
for fd in i:
if fd == read:
s = os.read(read, 1000)
@@ -992,17 +1001,17 @@
command = '/bin/rm'
args = [command, '-f', SSL_PRIVKEY_PATH, SSL_PUBKEY_PATH]
_execWithCaptureErrorStatus(command, args)
-
+
# /usr/bin/openssl genrsa -out /var/lib/luci/var/certs/privkey.pem 2048 > /dev/null 2>&1
command = '/usr/bin/openssl'
args = [command, 'genrsa', '-out', SSL_PRIVKEY_PATH, '2048']
_execWithCaptureErrorStatus(command, args)
-
+
# /usr/bin/openssl req -new -x509 -key /var/lib/luci/var/certs/privkey.pem -out /var/lib/luci/var/certs/cacert.pem -days 1825 -config /var/lib/luci/var/certs/cacert.config
command = '/usr/bin/openssl'
args = [command, 'req', '-new', '-x509', '-key', SSL_PRIVKEY_PATH, '-out', SSL_PUBKEY_PATH, '-days', '1825', '-config', SSL_KEYCONFIG_PATH]
_execWithCaptureErrorStatus(command, args)
-
+
# take ownership and restrict access
try:
uid, gid = get_luci_uid_gid()
@@ -1015,7 +1024,7 @@
args = [command, '-f', SSL_PRIVKEY_PATH, SSL_PUBKEY_PATH]
_execWithCaptureErrorStatus(command, args)
return False
-
+
return True
@@ -1037,37 +1046,37 @@
sys.stderr.write('If you want to reset admin password, execute\n')
sys.stderr.write('\t' + argv[0] + ' password\n')
sys.exit(1)
-
+
print 'Initializing the Luci server\n'
-
+
print '\nCreating the \'admin\' user\n'
- password = read_passwd('Enter password: ', 'Confirm password: ')
+ new_password = read_passwd('Enter password: ', 'Confirm password: ')
print '\nPlease wait...'
- if not set_zope_passwd('admin', password):
+ if not set_zope_passwd('admin', new_password):
restore_luci_db_fsattr()
print 'The admin password has been successfully set.'
else:
sys.stderr.write('Unable to set the admin user\'s password.\n')
sys.exit(1)
-
+
print 'Generating SSL certificates...'
if generate_ssl_certs() == False:
sys.stderr.write('failed. exiting ...\n')
sys.exit(1)
-
+
print 'Luci server has been successfully initialized'
restart_message()
-
+
return
def password(argv):
- password = None
+ passwd = None
if '--random' in argv:
print 'Resetting the admin user\'s password to some random value\n'
try:
rand = open('/dev/urandom', 'r')
- password = rand.read(16)
+ passwd = rand.read(16)
rand.close()
except:
sys.stderr.write('Unable to read from /dev/urandom\n')
@@ -1078,12 +1087,12 @@
sys.stderr.write('To initialize it, execute\n')
sys.stderr.write('\t' + argv[0] + ' init\n')
sys.exit(1)
-
+
print 'Resetting the admin user\'s password\n'
- password = read_passwd('Enter new password: ', 'Confirm password: ')
-
+ passwd = read_passwd('Enter new password: ', 'Confirm password: ')
+
print '\nPlease wait...'
- if not set_zope_passwd('admin', password):
+ if not set_zope_passwd('admin', passwd):
print 'The admin password has been successfully reset.'
else:
sys.stderr.write('Unable to set the admin user\'s password.\n')
@@ -1118,7 +1127,7 @@
# The LUCI_BACKUP_DIR must not be world-writable
# as the code below is obviously not safe against
# races.
- stat = os.stat(LUCI_BACKUP_PATH)
+ os.stat(LUCI_BACKUP_PATH)
trynum = 1
basename = '/luci_backup-'
@@ -1128,7 +1137,7 @@
try:
os.rename(LUCI_BACKUP_PATH, oldbackup)
except:
- sys.stderr.stderr('Unable to rename the existing backup file.\n')
+ sys.stderr.write('Unable to rename the existing backup file.\n')
sys.stderr.write('The Luci backup failed.\n')
break
trynum += 1
@@ -1162,8 +1171,10 @@
def restore(argv):
print 'Restoring the Luci server...'
- try: os.umask(077)
- except: pass
+ try:
+ os.umask(077)
+ except:
+ pass
if luci_restore(argv[2:]):
ret = False
@@ -1197,7 +1208,7 @@
def test_luci_installation():
# perform basic checks
# TODO: do more tests
-
+
# check if luci user and group are present on the system
try:
get_luci_uid_gid()
@@ -1206,7 +1217,7 @@
sys.stderr.write('Mising luci\'s system account and group')
sys.stderr.write('Recommended action: reinstall luci\n\n')
sys.exit(3)
-
+
return True
@@ -1214,16 +1225,9 @@
if len(argv) < 2:
luci_help(argv)
sys.exit(1)
-
- # only root should run this
- if os.getuid() != 0:
- sys.stderr.write('Only \'root\' can run ' + argv[0] + '\n')
- sys.stderr.write('Try again with root privileges.\n')
- sys.exit(2)
- # test if luci installation is OK
test_luci_installation()
-
+
if 'init' in argv:
init(argv)
elif 'backup' in argv:
next reply other threads:[~2007-08-13 19:06 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-13 19:06 rmccabe [this message]
-- strict thread matches above, loose matches on Subject: below --
2008-07-29 19:47 [Cluster-devel] conga ./clustermon.spec.in.in ./conga.spec.in. rmccabe
2008-07-28 17:49 rmccabe
2008-05-12 15:13 rmccabe
2008-04-18 3:31 rmccabe
2008-04-11 6:54 rmccabe
2008-04-11 6:48 rmccabe
2008-04-07 20:11 rmccabe
2008-02-12 17:40 rmccabe
2008-01-29 22:02 rmccabe
2007-08-20 16:23 rmccabe
2007-08-09 22:02 rmccabe
2007-08-08 21:24 rmccabe
2007-06-27 7:43 rmccabe
2007-05-01 15:57 rmccabe
2007-04-11 20:15 rmccabe
2007-04-11 19:23 rmccabe
2007-03-20 20:52 kupcevic
2007-02-07 1:36 kupcevic
2007-02-05 22:01 kupcevic
2007-02-05 20:08 rmccabe
2007-02-05 12:12 kupcevic
2007-01-23 22:34 kupcevic
2007-01-17 16:36 kupcevic
2007-01-17 14:57 kupcevic
2007-01-17 14:32 kupcevic
2006-12-13 19:21 kupcevic
2006-12-12 13:53 kupcevic
2006-11-17 20:46 kupcevic
2006-11-17 0:59 kupcevic
2006-11-16 19:35 kupcevic
2006-11-02 0:46 rmccabe
2006-11-01 23:11 kupcevic
2006-11-01 20:43 rmccabe
2006-10-31 20:34 kupcevic
2006-10-25 18:47 rmccabe
2006-10-25 16:35 kupcevic
2006-10-16 21:01 kupcevic
2006-10-16 15:56 kupcevic
2006-10-04 16:32 kupcevic
2006-09-26 5:21 kupcevic
2006-08-22 23:01 kupcevic
2006-08-22 20:12 kupcevic
2006-08-16 6:34 kupcevic
2006-08-15 4:15 kupcevic
2006-08-09 21:13 kupcevic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070813190647.923.qmail@sourceware.org \
--to=rmccabe@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.