source: src-qt4/pc-pfmanager/config/rcconfig.cpp @ b2e44e2

9.2-releasereleng/10.0releng/10.0.1
Last change on this file since b2e44e2 was b2e44e2, checked in by Kris Moore <kris@…>, 12 months ago

Firewall is enabled by default

Remove stale old binary

  • Property mode set to 100755
File size: 5.8 KB
Line 
1
2#include "rcconfig.hpp"
3#include <qfile.h>
4#include <qtextstream.h>
5#include <iostream>
6#include <QRegExp>
7#include <QTextStream>
8
9RcConfig::RcConfig ( void )
10    : _modified(false)
11{
12}
13
14RcConfig::~RcConfig ( void )
15{
16}
17
18RcConfig* RcConfig::fromDefault ( void )
19{
20    return RcConfig::fromFile("/etc/rc.conf");
21}
22
23RcConfig* RcConfig::fromFile ( const QString& filename )
24{
25    RcConfig* inst = new RcConfig;
26    QFile file(filename);
27   
28    if ( file.open(QIODevice::ReadOnly) )
29    { // It went good
30        QString line;
31           
32        while ( !file.atEnd() )
33        {
34            line = file.readLine();
35            // Push back the lines of the file
36            inst->_lines.push_back(line);
37        }
38        inst->_file = filename;
39    }
40    else
41    { // Error to report
42        throw QString(tr("Error opening the specified rc.conf file."));
43    }
44    return inst;
45}
46
47// It may be a code doubling... but providing const/non const
48// is necessary to improve overall performance
49RcConfig::qstr_vector_it RcConfig::findLine ( const QRegExp& rx )
50{
51    qstr_vector_revit it = _lines.rbegin();
52    qstr_vector_revit last = _lines.rend();
53   
54    while ( it != last )
55    {
56        QString line = *it++;
57       
58        if ( rx.exactMatch(line) )
59        {
60            return it.base();
61        }
62    }
63    return _lines.end();
64}
65
66RcConfig::qstr_vector_cit RcConfig::findLine ( const QRegExp& rx ) const
67{
68    qstr_vector_crevit it = _lines.rbegin();
69    qstr_vector_crevit last = _lines.rend();
70   
71    // Reverse lookup: We need to find the LAST line
72    // since the last line is the one with the effect
73    while ( it != last )
74    {
75        QString line = *it++;
76       
77        if ( rx.exactMatch(line) )
78        {
79            return it.base();
80        }
81    }
82    return _lines.end();
83}
84
85void RcConfig::save ( void )
86{
87    QFile file(_file);
88   
89    // Try to write file to disk
90    //
91    if ( _modified )
92    { // We only save if the _modified flag is true
93        if ( file.open(QIODevice::WriteOnly) )
94        {
95            QTextStream stream(&file);
96           
97            for ( qstr_vector_cit it = _lines.begin();
98                it != _lines.end();
99                it++ )
100            { // Write line by line...
101                stream << (*it) << "\n";
102            }
103            _modified = false;
104        }
105    }
106}
107
108bool RcConfig::isEnabled ( const QString& service ) const
109{
110    const QString sregex = service + "_enable=\"[a-zA-Z]+\"\\s*";
111    const QRegExp regex(sregex);
112    qstr_vector_cit found;
113
114    // PF is enabled by default in /etc/rc.conf.pcbsd
115    bool enabled = true;
116   
117    found = findLine(regex);
118    if ( found != _lines.end() )
119    { // We have found one... let's see if it's enabled
120        QString line = (*found);
121       
122        if (line.indexOf("\"yes\"") == -1 && line.indexOf("\"YES\"") == -1 )
123                enabled = false;
124        else
125                enabled = true;
126    }
127    return enabled;
128}
129
130void RcConfig::enable ( const QString& service, const QString& enable )
131{
132    const QString sregex = service + "_enable=\"[a-zA-Z]*\"\\s*";
133    const QString senable = service + "_enable=\"" + enable + "\"";
134    const QRegExp regex(sregex);
135    qstr_vector_it found;
136   
137    found = RcConfig::findLine(regex);
138    if ( found != _lines.end() )
139    { // Let's replace the old
140        QString line = *found;
141        if ( line.indexOf("\"" + enable + "\"") != -1 )
142        { // but only if it does not have the current state
143            _lines.erase(found);
144            _lines.insert(found, senable); 
145            _modified = true;
146        }
147    }
148    else
149    { // Append the needed lines...       
150        _lines.push_back(senable);
151        _modified = true;
152    }
153    // And save changes
154    save();
155}
156
157void RcConfig::enable ( const QString& service )
158{
159    enable(service, "YES");
160}
161
162void RcConfig::disable ( const QString& service )
163{
164    enable(service, "NO");
165}
166
167void RcConfig::addParameter ( const QString& service, const QString& param, const QString& value )
168{
169    const QString sxline = service + "_" + param + "=\"[^\"]*\"\\s*";
170    const QString sxvalue = service + "_" + param + "=\"" + value + "\"\\s*";
171    QString newline = service + "_" + param + "=\"" + value + "\"";
172    const QRegExp xline(sxline);
173    const QRegExp xvalue(sxvalue);
174    qstr_vector_it found;
175   
176    found = findLine(xline);
177    if ( found != _lines.end() )
178    { // We have such a line
179        QString line = *found;
180       
181        if ( !xvalue.exactMatch(line) )
182        { // Let's modify it...
183            _lines.erase(found);
184            _lines.insert(found, newline);
185            _modified = true;
186        }
187    }
188    else
189    { // We do not have such a line, therefore we append it
190        _lines.push_back(newline);
191        _modified = true;
192    }
193    // And save the changes (if there are some)
194    save();
195}
196
197bool RcConfig::getParameter ( const QString& service, const QString& param, QString& retvalue ) const
198{
199    const QString sregex = service + "_" + param + "=\"([^\"]*)\"\\s*";
200    QRegExp regex(sregex);   
201    qstr_vector_cit it;
202    bool success = false;
203   
204    it = findLine(regex);
205    if ( it != _lines.end() )
206    {
207        QString line = *it;
208        int pos = 0;
209        // Fetch the value
210        pos = regex.indexIn(line);
211        if ( pos > -1 )
212        { // Retrieve capture
213            retvalue = regex.cap(1);
214            success = true;
215        }
216    }
217    // nothing found
218    return success;
219}
220
221bool RcConfig::exists ( const QString& service ) const
222{
223    const QString sregex = service + "_enable=\"[a-zA-Z]*\"\\s*";
224    const QRegExp regex(sregex);
225    qstr_vector_cit it;
226   
227    return ( (it = findLine(regex)) != _lines.end() );
228}
229
230bool RcConfig::exists ( const QString& service, const QString& param ) const
231{
232    const QString sregex = service + "_" + param + "=\"[^\"]*\"\\s*";
233    const QRegExp regex(sregex);
234    qstr_vector_cit it;
235   
236    return ( (it = findLine(regex)) != _lines.end() );
237}
238
Note: See TracBrowser for help on using the repository browser.