1 #include "inetwork.h"
2 #include <QFile>
3 #include "systemmanager.h"
4 #include "terminal.h"
5 #include <QLoggingCategory>
6 Q_LOGGING_CATEGORY(flapp, "app.network")
7
broadCast(const QString & ip,const QString & mask)8 QString INetwork::broadCast(const QString &ip, const QString &mask)
9 {
10 // ip & mask | ~mask
11 QString ret;
12 QStringList ipList = ip.split('.');
13 QStringList maskList = mask.split('.');
14 if(ipList.size() !=4 || maskList.size() !=4)
15 {
16 return ret;
17 }
18 for(int i=0; i<4; i++){
19 int ipV = ipList[i].toInt();
20 int maskV = maskList[i].toInt();
21 ret += QString::number((ipV&maskV)|(~ maskV & 255));
22 if(i<3){
23 ret +='.';
24 }
25 }
26 return ret;
27 }
28
getMaskBits(const QString & mask)29 QString INetwork::getMaskBits(const QString &mask)
30 { //获取子网掩码 二进制 1的个数.也就是网络号.
31 int k =0;
32 QStringList list =mask.split(".");
33 for(int i=0, u=1;i<list.size(); i++, u=1){
34 int n = list[i].toInt();
35 for(; u<=n; u=u<<1 )
36 if(u & n)
37 k++;
38 }
39 return QString::number(k);
40 }
41
filter(const QString & cardName)42 QString INetwork::filter(const QString &cardName)
43 {
44 QString srcData;
45 QFile file(pathName());
46 if(QFile::exists(pathName()) && file.open(QFile::ReadOnly|QFile::Text)){
47 srcData = file.readAll();
48 file.close();
49 }
50
51 //保存原始数据.
52 QString s;
53 if(!srcData.isEmpty())
54 {
55 s = filterHandld(srcData, cardName);
56 }
57
58 return s;
59 }
60
writeData(const QString & data,const QString & fileName)61 void INetwork::writeData(const QString &data, const QString &fileName)
62 {
63 QString s = pathName();;
64 if(!fileName.isEmpty())
65 s = fileName;
66
67 QFile file(s);
68 if(file.open(QFile::ReadWrite | QFile::Text | QFile::Truncate))
69 {
70 file.write(data.toLocal8Bit());
71 file.close();
72 }
73 }
74
~INetwork()75 INetwork::~INetwork()
76 {
77
78 }
79
guessCreate()80 INetwork *INetwork::guessCreate()
81 {
82 INetwork * pNetwork=nullptr;
83 QString systemd_networkd=Terminal::execCmd("systemctl status systemd-networkd | grep running");
84 bool bSystemCtl = systemd_networkd.contains("running");
85 if(bSystemCtl){
86 pNetwork = new SystemCtlMange;
87 qCDebug(flapp)<<"create SystemCtlMange";
88 }else if(QFile::exists("/etc/init.d/networking")){
89 pNetwork = new ManualMange;
90 qCDebug(flapp)<<"create ManualMange";
91 }else {
92 pNetwork = new ManualMangeNotServer;
93 qCDebug(flapp)<<"create ManualMangeNotServer";
94 }
95 return pNetwork;
96 }
97
98
filterHandld(const QString & s,const QString & cardName)99 QString ManualMange::filterHandld(const QString &s, const QString &cardName)
100 {
101 QString ret;
102 QStringList list = s.split("\n", QString::SkipEmptyParts);
103 int bFind = false;
104 foreach (QString r, list) {
105 if(r.contains("auto") && r.contains(cardName)){
106 bFind = true;
107 }else if(r.contains("auto"))
108 {
109 bFind = false;
110 }
111
112 if(!bFind)
113 {
114 ret += r +"\n";
115 }
116 }
117
118 return ret;
119 }
120
setStatic(const QString & cardName,const QString & ip,const QString & mask,const QString & gateway,const QString & dns)121 void ManualMange::setStatic(const QString &cardName, const QString &ip, const QString &mask, const QString &gateway, const QString &dns)
122 {
123 QString broad = broadCast(ip, mask);
124 QString card=QString("auto %1\niface %2 inet static\naddress %3\nnetmask %4\nbroadcast %5\ngateway %6\n")
125 .arg(cardName)
126 .arg(cardName)
127 .arg(ip)
128 .arg(mask)
129 .arg(broad)
130 .arg(gateway);
131
132 QString s = filter(cardName);
133 writeData( s + card);
134
135 SystemManager::instance()->setDNS(dns);
136 }
137
exec()138 QString ManualMange::exec()
139 {
140 system("sync");
141 QString ret = Terminal::execCmd("/etc/init.d/networking restart");
142 return ret;
143 }
144
145
setAuto(const QString & cardName)146 void ManualMange::setAuto(const QString &cardName)
147 {
148 QString s = filter(cardName);
149 QString card=QString("auto %1\niface %1 inet dhcp\n").arg(cardName).arg(cardName);
150 writeData(s +card);
151 system(QString("ifconfig %1 up").arg(cardName).toLocal8Bit().constData());
152 }
153
pathName()154 QString ManualMange::pathName()
155 {
156 QString fileName="/etc/network/interfaces";
157 return fileName;
158 }
159
setStatic(const QString & cardName,const QString & ip,const QString & mask,const QString & gateway,const QString & dns)160 void SystemCtlMange::setStatic(const QString &cardName, const QString &ip, const QString &mask, const QString &gateway, const QString &dns)
161 {
162 QString ipNet= ip +"/" + getMaskBits(mask);//172.16.24.112/24
163 QString card =QString("[Match]\nName=%1\n[Network]\nAddress=%2\nGateway=%3\nDNS=%4\n")
164 .arg(cardName)
165 .arg(ipNet)
166 .arg(gateway)
167 .arg(dns);
168
169 QString s =filter(cardName);
170 writeData(s + card);
171
172 SystemManager::instance()->setDNS(dns);
173 system(QString("ifconfig %1 up").arg(cardName).toLocal8Bit().constData());
174 }
175
exec()176 QString SystemCtlMange::exec()
177 {
178 system("sync");
179 return Terminal::execCmd("sudo systemctl restart systemd-networkd");
180 }
181
filterHandld(const QString & s,const QString & cardName)182 QString SystemCtlMange::filterHandld(const QString &s, const QString &cardName)
183 {
184 QStringList temp;
185 QString ret;
186 QStringList list = s.split("\n", QString::SkipEmptyParts);
187 bool bFind = false;
188
189 for(int i=0; i<list.size(); i++)
190 {
191 if(list[i].contains(cardName))
192 {
193 bFind = true;
194 if(temp.size()>0 && temp.last().contains("Match"))
195 temp.removeLast();
196
197 }else if(bFind ==false){
198 temp << list[i];
199 }else if(bFind ==true && list[i].contains("Match"))
200 {
201 temp <<list[i];
202 bFind = false;
203 }
204 }
205
206 foreach (QString s, temp) {
207 ret +=s + "\n";
208 }
209
210 return ret;
211 }
212
setAuto(const QString & cardname)213 void SystemCtlMange::setAuto(const QString &cardname)
214 {
215 QString s = filter(cardname);
216 QString card=QString("[Match]\nName=%1\n[Network]\nDHCP=yes").arg(cardname);
217 writeData(s +card);
218 }
219
pathName()220 QString SystemCtlMange::pathName()
221 {
222 QString fileName="/etc/systemd/network/10-eth.network";
223 return fileName;
224 }
225
setAuto(const QString & cardName)226 void ManualMangeNotServer::setAuto(const QString &cardName)
227 {
228 ManualMange::setAuto(cardName);
229 ManualMange::writeData("auto\niface inet dhcp\n");
230 QString fileName ="/etc/network/.conf/"+cardName;
231 writeData("dhcp\n",fileName);
232 QString cmd = QString("udhcpc -i %1").arg(cardName);
233 ::system(cmd.toLocal8Bit().constData());
234 }
235
setStatic(const QString & cardName,const QString & ip,const QString & mask,const QString & gateway,const QString & dns)236 void ManualMangeNotServer::setStatic(const QString &cardName, const QString &ip, const QString &mask, const QString &gateway, const QString &dns)
237 {
238 ManualMange::setStatic(cardName, ip, mask, gateway, dns);
239
240 m_result.clear();
241 m_result +=Terminal::execCmd(QString("ifconfig %1 up").arg(cardName ));
242 m_result+=Terminal::execCmd(QString("ifconfig %1 %2").arg(cardName).arg(ip));
243 m_result+=Terminal::execCmd(QString("route add default gateway %1").arg(gateway));
244 }
245
exec()246 QString ManualMangeNotServer::exec()
247 {
248 system("sync");
249 return "";
250 }
251