2017-10-14 Fred Gleason <fredg@paravelsystems.com>

* Implemented a 'NewHostIpAddress=' parameter in the [Provisioning]
	section of rd.conf(5).
This commit is contained in:
Fred Gleason
2017-10-14 14:54:43 -04:00
parent a5861283c9
commit 2381fb89ff
7 changed files with 62 additions and 5 deletions

View File

@@ -23,6 +23,10 @@
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
#endif // WIN32
#include <qmessagebox.h>
@@ -261,6 +265,12 @@ QString RDConfig::provisioningHostTemplate() const
}
QHostAddress RDConfig::provisioningHostIpAddress() const
{
return conf_provisioning_host_ip_address;
}
bool RDConfig::provisioningCreateService() const
{
return conf_provisioning_create_service;
@@ -450,6 +460,7 @@ void RDConfig::load()
char sname[256];
QString client;
QString facility;
QString iface;
#ifndef WIN32
struct passwd *user;
struct group *groups;
@@ -489,6 +500,7 @@ void RDConfig::load()
profile->boolValue("Provisioning","CreateHost");
conf_provisioning_host_template=
profile->stringValue("Provisioning","NewHostTemplate");
iface=profile->stringValue("Provisioning","NewHostIpAddress","lo");
conf_provisioning_create_service=
profile->boolValue("Provisioning","CreateService");
conf_provisioning_service_template=
@@ -566,6 +578,33 @@ void RDConfig::load()
conf_destinations.push_back(dest);
}
delete profile;
//
// Resolve Interface Address
//
int sock=-1;
if((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_IP))<0) {
return;
}
#ifndef WIN32
struct ifreq ifr;
int index=0;
memset(&ifr,0,sizeof(ifr));
index=1;
ifr.ifr_ifindex=index;
while(ioctl(sock,SIOCGIFNAME,&ifr)==0) {
if(ifr.ifr_name==iface) {
if(ioctl(sock,SIOCGIFADDR,&ifr)==0) {
struct sockaddr_in sa=*(sockaddr_in *)(&ifr.ifr_addr);
conf_provisioning_host_ip_address.setAddress(ntohl(sa.sin_addr.s_addr));
}
}
ifr.ifr_ifindex=++index;
}
close(sock);
#endif // WIN32
}
@@ -595,6 +634,7 @@ void RDConfig::clear()
conf_log_xload_debug_data=false;
conf_provisioning_create_host=false;
conf_provisioning_host_template="";
conf_provisioning_host_ip_address.setAddress("127.0.0.2");
conf_provisioning_create_service=false;
conf_provisioning_service_template="";
conf_alsa_period_quantity=RD_ALSA_DEFAULT_PERIOD_QUANTITY;

View File

@@ -2,7 +2,7 @@
//
// A container class for a Rivendell Base Configuration
//
// (C) Copyright 2002-2004,2016 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2004,2016-2017 Fred Gleason <fredg@paravelsystems.com>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
@@ -28,6 +28,7 @@
#include <vector>
#include <qhostaddress.h>
#include <qstring.h>
#include <rd.h>
@@ -67,6 +68,7 @@ class RDConfig
void log(const QString &module,LogPriority prio,const QString &msg);
bool provisioningCreateHost() const;
QString provisioningHostTemplate() const;
QHostAddress provisioningHostIpAddress() const;
bool provisioningCreateService() const;
QString provisioningServiceTemplate() const;
int alsaPeriodQuantity() const;
@@ -127,6 +129,7 @@ class RDConfig
QString conf_log_pattern;
bool conf_provisioning_create_host;
QString conf_provisioning_host_template;
QHostAddress conf_provisioning_host_ip_address;
bool conf_provisioning_create_service;
QString conf_provisioning_service_template;
bool conf_log_xload_debug_data;

View File

@@ -664,15 +664,21 @@ void RDStation::setCardOutputs(int cardnum,int outputs) const
bool RDStation::create(const QString &name,QString *err_msg,
const QString &exemplar)
const QString &exemplar,const QHostAddress &hostaddr)
{
QString sql;
RDSqlQuery *q;
RDSqlQuery *q1;
QHostAddress addr=hostaddr;
if(addr.isNull()) {
addr.setAddress("127.0.0.1");
}
if(exemplar.isEmpty()) { // Create Blank Host Config
sql=QString("insert into STATIONS set ")+
"NAME=\""+RDEscapeString(name)+"\","+
"IPV4_ADDRESS=\""+RDEscapeString(addr.toString())+"\","+
"DESCRIPTION=\"Workstation "+RDEscapeString(name)+"\","+
"USER_NAME=\"user\","+
"DEFAULT_NAME=\"user\"";
@@ -755,6 +761,7 @@ bool RDStation::create(const QString &name,QString *err_msg,
if(q->first()) {
sql=QString("insert into STATIONS set ")+
"NAME=\""+RDEscapeString(name)+"\","+
"IPV4_ADDRESS=\""+RDEscapeString(addr.toString())+"\","+
"DESCRIPTION=\""+RDEscapeString("Workstation "+name)+"\","+
"USER_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+
"DEFAULT_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+

View File

@@ -132,7 +132,8 @@ class RDStation
int cardOutputs(int cardnum) const;
void setCardOutputs(int cardnum,int outputs) const;
static bool create(const QString &name,QString *err_msg,
const QString &exemplar="");
const QString &exemplar="",
const QHostAddress &hostaddr=QHostAddress());
static void remove(const QString &name);
private: