From 51dd46e84e3e21fc40495c192b5052df2b1a865a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 30 Nov 2011 15:34:16 +0200 Subject: [PATCH 1/5] * move server's hostname on IRC to realname, part 1: config file and connect command --- server/electrum.conf.sample | 1 + server/server.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/server/electrum.conf.sample b/server/electrum.conf.sample index 6aebfc39c..c19775065 100644 --- a/server/electrum.conf.sample +++ b/server/electrum.conf.sample @@ -4,6 +4,7 @@ port = 50000 password = secret banner = Welcome to Electrum! irc = yes +ircname = public Electrum server [database] type = sqlite3 diff --git a/server/server.py b/server/server.py index b58e99a00..baf6391a9 100755 --- a/server/server.py +++ b/server/server.py @@ -443,7 +443,7 @@ def irc_thread(): try: s = socket.socket() s.connect(('irc.freenode.net', 6667)) - s.send('USER '+config.get('server','host')+' '+NICK+' bla :'+NICK+'\n') + s.send('USER electrum 0 * '+config.get('server','host')+' '+config.get('server','ircname')+'\n') s.send('NICK '+NICK+'\n') s.send('JOIN #electrum\n') t = 0 From 68790df27f0a78ddcbc67be14f499cc57b08eae7 Mon Sep 17 00:00:00 2001 From: Ovidiu Constantin Date: Wed, 30 Nov 2011 16:05:46 +0200 Subject: [PATCH 2/5] * move server's hostname on IRC to realname, part 2: parsing the output of /who --- server/server.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/server/server.py b/server/server.py index baf6391a9..6fcf49101 100755 --- a/server/server.py +++ b/server/server.py @@ -461,15 +461,13 @@ def irc_thread(): continue for item in line[k+1:k2]: if item[0:2] == 'E_': - s.send('USERHOST %s\n'%item) - elif '302' in line: # answer to /userhost - k = line.index('302') - m = re.match( "^:(.*?)=\+~(.*?)@(.*?)$", line[k+2] ) - if m: - name = m.group(1) - host = m.group(2) - ip = m.group(3) - peer_list[name] = (ip,host) + s.send('WHO %s\n'%item) + elif '352' in line: # answer to /who + # warning: this is a horrible hack which apparently works + name = line[2] + ip = line[10] + host = line[5] + peer_list[name] = (ip,host) elif time.time() - t > 5*60: s.send('NAMES #electrum\n') t = time.time() From 181b5906992cafc1bbf3875566b75cd5ecbf44ff Mon Sep 17 00:00:00 2001 From: Ovidiu Constantin Date: Wed, 30 Nov 2011 16:55:16 +0200 Subject: [PATCH 3/5] * move server's hostname on IRC to realname, part 3: making it work --- server/server.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/server/server.py b/server/server.py index 6fcf49101..88abd080c 100755 --- a/server/server.py +++ b/server/server.py @@ -443,30 +443,28 @@ def irc_thread(): try: s = socket.socket() s.connect(('irc.freenode.net', 6667)) - s.send('USER electrum 0 * '+config.get('server','host')+' '+config.get('server','ircname')+'\n') + s.send('USER electrum 0 * :'+config.get('server','host')+' '+config.get('server','ircname')+'\n') s.send('NICK '+NICK+'\n') s.send('JOIN #electrum\n') + sf = s.makefile('r', 0) t = 0 while not stopping: - line = s.recv(2048) + line = sf.readline() line = line.rstrip('\r\n') line = line.split() if line[0]=='PING': s.send('PONG '+line[1]+'\n') elif '353' in line: # answer to /names k = line.index('353') - try: - k2 = line.index('366') - except: - continue - for item in line[k+1:k2]: + for item in line[k+1:]: if item[0:2] == 'E_': s.send('WHO %s\n'%item) elif '352' in line: # answer to /who # warning: this is a horrible hack which apparently works - name = line[2] - ip = line[10] - host = line[5] + k = line.index('352') + ip = line[k+4] + name = line[k+6] + host = line[k+9] peer_list[name] = (ip,host) elif time.time() - t > 5*60: s.send('NAMES #electrum\n') @@ -474,6 +472,7 @@ def irc_thread(): except: traceback.print_exc(file=sys.stdout) finally: + sf.close() s.close() From 493c74dde0c4e1a8af7785884081911110e381c2 Mon Sep 17 00:00:00 2001 From: Ovidiu Constantin Date: Wed, 30 Nov 2011 16:59:21 +0200 Subject: [PATCH 4/5] * when I said IP, I meant IP, not hostnames. --- server/server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server/server.py b/server/server.py index 88abd080c..da2364c55 100755 --- a/server/server.py +++ b/server/server.py @@ -463,6 +463,7 @@ def irc_thread(): # warning: this is a horrible hack which apparently works k = line.index('352') ip = line[k+4] + ip = socket.gethostbyname(ip) name = line[k+6] host = line[k+9] peer_list[name] = (ip,host) From b513536fb11f414b2f61693a0d2563fe446a77b9 Mon Sep 17 00:00:00 2001 From: Ovidiu Constantin Date: Wed, 30 Nov 2011 17:08:01 +0200 Subject: [PATCH 5/5] * small IRC fix and doc --- server/README-IRC.txt | 18 ++++++++++++++++++ server/server.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 server/README-IRC.txt diff --git a/server/README-IRC.txt b/server/README-IRC.txt new file mode 100644 index 000000000..49650a88c --- /dev/null +++ b/server/README-IRC.txt @@ -0,0 +1,18 @@ +IRC is used by Electrum server to find 'peers' - other Electrum servers. The current list can be seen by running: + +./server.py peers + +The following config file options are used by the IRC part of Electrum server: + +[server] +irc = yes +host = fqdn.host.name.tld +ircname = some short description + +'irc' is used to determine whether the IRC thread will be started or the Electrum server will run in private mode. In private mode, ./server.py peers will always return an empty list. + +'host' is a fqdn of your Electrum server. It is used both when binding the listener for incoming clien conections, and also as part of the realname field in IRC (see below). + +'ircname' is a short text that will be appended to 'host' when composing the IRC realname field: + +realname = 'host' + ' ' + 'ircname', for example 'fqdn.host.name.tld some short description' diff --git a/server/server.py b/server/server.py index da2364c55..693e45cbc 100755 --- a/server/server.py +++ b/server/server.py @@ -40,6 +40,7 @@ config.set('server', 'host', 'ecdsa.org') config.set('server', 'port', 50000) config.set('server', 'password', '') config.set('server', 'irc', 'yes') +config.set('server', 'ircname', 'Electrum server') config.add_section('database') config.set('database', 'type', 'psycopg2') config.set('database', 'database', 'abe')