[About] Display network info in About menu.
[vuplus_dvbapp] / lib / python / Components / About.py
1 from Tools.Directories import resolveFilename, SCOPE_SYSETC
2 from enigma import getEnigmaVersionString
3 from os import popen
4
5 class About:
6         def __init__(self):
7                 pass
8
9         def getVersionString(self):
10                 return self.getImageVersionString()
11
12         def getImageVersionString(self):
13                 try:
14                         file = open(resolveFilename(SCOPE_SYSETC, 'image-version'), 'r')
15                         lines = file.readlines()
16                         for x in lines:
17                                 splitted = x.split('=')
18                                 if splitted[0] == "version":
19                                         #     YYYY MM DD hh mm
20                                         #0120 2005 11 29 01 16
21                                         #0123 4567 89 01 23 45
22                                         version = splitted[1]
23                                         image_type = version[0] # 0 = release, 1 = experimental
24                                         major = version[1]
25                                         minor = version[2]
26                                         revision = version[3]
27                                         year = version[4:8]
28                                         month = version[8:10]
29                                         day = version[10:12]
30                                         date = '-'.join((year, month, day))
31                                         if image_type == '0':
32                                                 image_type = "Release"
33                                                 version = '.'.join((major, minor, revision))
34                                                 return ' '.join((image_type, version, date))
35                                         else:
36                                                 image_type = "Experimental"
37                                                 return ' '.join((image_type, date))
38                         file.close()
39                 except IOError:
40                         pass
41
42                 return "unavailable"
43
44         def getEnigmaVersionString(self):
45                 return getEnigmaVersionString()
46
47         def getKernelVersionString(self):
48                 try:
49                         result = popen("uname -r","r").read().strip("\n").split('-')
50                         kernel_version = result[0]
51                         return kernel_version
52                 except:
53                         pass
54
55                 return "unknown"
56
57         def getIfaces(self):
58                 import socket, fcntl, struct, array, sys
59                 SIOCGIFCONF = 0x8912 # sockios.h
60                 is_64bits = sys.maxsize > 2**32
61                 struct_size = 40 if is_64bits else 32
62                 max_possible = 8 # initial value
63                 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
64                 while True:
65                         # ifconf structure:
66                         # struct ifconf {
67                         #               int                     ifc_len; /* size of buffer */
68                         #               union {
69                         #                       char            *ifc_buf; /* buffer address */
70                         #                       struct ifreq    *ifc_req; /* array of structures */
71                         #               };
72                         #       };
73                         #
74                         # struct ifreq:
75                         # #define IFNAMSIZ      16
76                         # struct ifreq {
77                         #       char ifr_name[IFNAMSIZ]; /* Interface name */
78                         #       union {
79                         #               struct sockaddr ifr_addr;
80                         #               .....
81                         #       };
82                         # };
83
84                         # Initialize ifc_buf
85                         bytes = max_possible * struct_size
86                         names = array.array('B')
87                         for i in range(0, bytes):
88                                 names.append(0)
89
90                         input_buffer = struct.pack( 'iL', bytes, names.buffer_info()[0] )
91                         output_buffer = fcntl.ioctl( sock.fileno(), SIOCGIFCONF, input_buffer )
92                         output_size = struct.unpack('iL', output_buffer)[0]
93
94                         if output_size == bytes:
95                                 max_possible *= 2
96                         else:
97                                 break
98
99                 namestr = names.tostring()
100                 ifaces = []
101                 for i in range(0, output_size, struct_size):
102                         iface_name = namestr[i:i+16].split('\0', 1)[0]
103                         iface_addr = socket.inet_ntoa(namestr[i+20:i+24])
104                         if iface_name != 'lo':
105                                 ifaces.append((iface_name, iface_addr))
106
107                 return ifaces
108
109         def getNetworkInfo(self):
110                 data = ""
111                 for x in self.getIfaces():
112                         data += "%s : %s\n" % (x[0], x[1])
113                 return data or "\tnot connected"
114
115 about = About()