xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/network/inetwork.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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