spawn ssh $user@$host
expect {
- "(yes/no)? " {
+ "(yes/no)? " {
send "yes\r"
send_user "Key accepted";
}
send_user "Key accepting dont needed";
}
}
-
-spawn cvs -d :ext:$user@$host:$cvsroot co -N -d $dir $module
+
+spawn cvs -d :ext:$user@$host:$cvsroot co -N -d $dir $module
expect {
"assword:" {
send "$pass\r"
expect {
- "assword:" {
+ "assword:" {
send_user "<h3><font color=red>cvs checkout $module failed. Incorrect password</font></h3>";
exit 1
}
}
}
}
-
+
"aborted" {
send_user "<h3><font color=red>cvs checkout $module failed.</font></h3>";
exit 1
}
}
-
+
int STG_CLIENT::Send(const RAD_PACKET & packet)
{
/*char buf[RAD_MAX_PACKET_LEN];
-
+
Encrypt(&ctx, buf, (char *)&packet, sizeof(RAD_PACKET) / 8);
int res = sendto(sock, buf, sizeof(RAD_PACKET), 0, (struct sockaddr *)&outerAddr, sizeof(outerAddr));
LogFileName = /var/log/rscriptd.log
# Amount of rscriptd-exec processes.
-# These processes are responsible for the execution of scripts
+# These processes are responsible for the execution of scripts
# OnConnect and OnDisconnect.
# Amount of processes means how many scripts can be executed simultaneously.
# Recommend to leave 1 to avoid errors when executing scripts
libs:
$(MAKE) -C $(DIR_LIBSRC)
-plugins: libs
+plugins: libs
$(MAKE) -C $(DIR_PLUGINS)
$(PROG): $(OBJS)
install -m $(DATA_MODE) -o $(OWNER) $(ETC_DIR)/rules $(PREFIX)/etc/stargazer/rules
install -m $(BIN_MODE) -o $(OWNER) $(ETC_DIR)/On* $(PREFIX)/etc/stargazer/
-
+
# Install file db
mkdir -m $(DIR_MODE) -p $(PREFIX)/var/stargazer/admins
mkdir -m $(DIR_MODE) -p $(PREFIX)/var/stargazer/tariffs
STG_LOCKER lock(&mutex);
parent::iterator it(parent::begin());
- while (it != parent::end())
+ while (it != parent::end())
{
delete *it++;
}
inline
ACTIONS_LIST::parent::iterator ACTIONS_LIST::begin()
-{
+{
STG_LOCKER lock(&mutex);
return parent::begin();
}
inline
ACTIONS_LIST::parent::iterator ACTIONS_LIST::end()
-{
+{
STG_LOCKER lock(&mutex);
return parent::end();
}
inline
ACTIONS_LIST::parent::const_iterator ACTIONS_LIST::begin() const
-{
+{
STG_LOCKER lock(&mutex);
return parent::begin();
}
inline
ACTIONS_LIST::parent::const_iterator ACTIONS_LIST::end() const
-{
+{
STG_LOCKER lock(&mutex);
return parent::end();
}
#! /bin/sh
#Этот скрипт вызывается в момент, когда пользователь
-#успешно прошел авторизацию на сервере. Задача скрипта - перестроить
+#успешно прошел авторизацию на сервере. Задача скрипта - перестроить
#файрвол так, что бы пользователь получил доступ в интернет
# Login
# Этот скрипт вызывается в момент, когда пользователь
# желает отключится от интернета или вышел таймаут у пользователя
# и сервер сам отключает пользователя
-# Задача скрипта подобна задаче скрипта OnConnect - перестроить
+# Задача скрипта подобна задаче скрипта OnConnect - перестроить
# файрвол так, что бы пользователю закрыть доступ в интернет
# Login
# Использование (неиспользование) этого скрипта дело вкуса.
# Он не выполняет критических функций. Его задача автматизировать
-# действия характерные при добавлении пользователя сети, например добавлекние
+# действия характерные при добавлении пользователя сети, например добавлекние
# пользователю почты
# Login
# The time interval between sending an alive query to the user
# and updating statistics
- # Parameter: required
+ # Parameter: required
# Values: 5 ... 600 (seconds)
# Default: 60
UserDelay = 60
- # User timeout. If authorizer does not respond during this time,
+ # User timeout. If authorizer does not respond during this time,
# the user will be disconnected
- # Parameter: required
+ # Parameter: required
# Values: 5 ... 600
# Default: 60
UserTimeout = 65
# FreeMb = cash - amount of money for which the user can download for free
# FreeMb = none - no transfer
# Default: cash
- # Parameter: required
+ # Parameter: required
# Values: different, see above
# Default: cash
FreeMb = cash
# Default: 6666
Port = 6666
- # List of services for which will be carried out FreeRADIUS authentication
+ # List of services for which will be carried out FreeRADIUS authentication
# Note: Parameter can be blank
# Parameter: required
# Value: any, supported by software
# Value: any, supported by software
# Default: Framed-User
AcctServices = Framed-User
-</Module>
\ No newline at end of file
+</Module>
# Define which user parameters are transferred to a remote server in addition to
# other parameters that transfered by default (ID, IP, Login, Cash, Dirs).
- # Note: Parameter can be blank.
- # Parameter: required
- # Values: Cash, FreeMb, Passive, Disabled, AlwaysOnline, TariffName,
- # NextTariff, Address, Note, Group, Email, RealName, Credit, EnabledDirs,
+ # Note: Parameter can be blank.
+ # Parameter: required
+ # Values: Cash, FreeMb, Passive, Disabled, AlwaysOnline, TariffName,
+ # NextTariff, Address, Note, Group, Email, RealName, Credit, EnabledDirs,
# Userdata0...Userdata9
# Default: Cash Tariff EnabledDirs
UserParams = Cash Tariff EnabledDirs
# Fee charged at the last (yes) or first (no) day of tariffication period.
# Defines how the fee will be charged in the transition to the new tariff.
# User has tariff A with fee 100. Changing it to tariff B with fee 200
-# will result in charging user's account at 100 if DayFeeIsLastDay = yes
+# will result in charging user's account at 100 if DayFeeIsLastDay = yes
# and at 200, if DayFeeIsLastDay = no
# Parameter: required
# Values: yes, no
# Defines what will be written in the traffic cost in detail_stat.
# If user still has the prepaid traffic and WriteFreeMbTraffCost = no,
# then the traffic cost willn't be written in detail_stat.
-# If user doestn't have prepaid traffic and WriteFreeMbTraffCost = no,
+# If user doestn't have prepaid traffic and WriteFreeMbTraffCost = no,
# then the traffic cost will be written in detail_stat.
# When WriteFreeMbTraffCost = yes the traffic cost will be recorded in any case.
# Parameter: required
# Default: yes
WriteFreeMbTraffCost = yes
-# Charge a full monthly fee even if user was "frozen" a part
+# Charge a full monthly fee even if user was "frozen" a part
# of the tariffication period
# Parameter: optional
# Values: yes, no
# Default: no
FullFee = no
-# Allow user to see and use a full cash (yes) or hide a part of it (no)
+# Allow user to see and use a full cash (yes) or hide a part of it (no)
# for the next fee charge
# Parameter: optional
# Values: yes, no
</DirNames>
# Amount of stg-exec processes.
-# These processes are responsible for the execution of scripts OnConnect,
-# OnDisconnect, etc.
+# These processes are responsible for the execution of scripts OnConnect,
+# OnDisconnect, etc.
# Amount of processes means how many scripts can be executed simultaneously.
# Recommend to leave 1 to avoid errors when executing scripts
# Parameter: optional
# Directory where the "monitor" files are located.
# A blank files will be created in this directory. The modification time of such
-# files will be changed about once a minute. If server crashes or some of server
+# files will be changed about once a minute. If server crashes or some of server
# component hang, the files will stop refreshing, and on this basis we can define
-# the failure of the server and if necessary restart.
+# the failure of the server and if necessary restart.
# If option is omitted or blank, the monitoring is not performed.
# Parameter: optional
# Value: file path
# The time interval between sending an alive query to the user
# and updating statistics
- # Parameter: required
+ # Parameter: required
# Values: 5 ... 600 (seconds)
# Default: 60
UserDelay = 60
- # User timeout. If authorizer does not respond during this time,
+ # User timeout. If authorizer does not respond during this time,
# the user will be disconnected
- # Parameter: required
+ # Parameter: required
# Values: 5 ... 600
# Default: 60
UserTimeout = 65
# FreeMb = cash - amount of money for which the user can download for free
# FreeMb = none - no transfer
# Default: cash
- # Parameter: required
+ # Parameter: required
# Values: different, see above
# Default: cash
FreeMb = cash
+
+ # Enables extended protocol logging.
+ # Parameter: optional
+ # Values: yes, no
+ # Default: no
+ # LogProtocolErrors = no
</Module>
# Default: 6666
Port = 6666
- # List of services for which will be carried out FreeRADIUS authentication
+ # List of services for which will be carried out FreeRADIUS authentication
# Note: Parameter can be blank
# Parameter: required
# Value: any, supported by software
# Value: any, supported by software
# Default: Framed-User
AcctServices = Framed-User
-</Module>
\ No newline at end of file
+</Module>
# Define which user parameters are transferred to a remote server in addition to
# other parameters that transfered by default (ID, IP, Login, Cash, Dirs).
- # Note: Parameter can be blank.
- # Parameter: required
- # Values: Cash, FreeMb, Passive, Disabled, AlwaysOnline, TariffName,
- # NextTariff, Address, Note, Group, Email, RealName, Credit, EnabledDirs,
+ # Note: Parameter can be blank.
+ # Parameter: required
+ # Values: Cash, FreeMb, Passive, Disabled, AlwaysOnline, TariffName,
+ # NextTariff, Address, Note, Group, Email, RealName, Credit, EnabledDirs,
# Userdata0...Userdata9
# Default: Cash Tariff EnabledDirs
UserParams = Cash Tariff EnabledDirs
# Fee charged at the last (yes) or first (no) day of tariffication period.
# Defines how the fee will be charged in the transition to the new tariff.
# User has tariff A with fee 100. Changing it to tariff B with fee 200
-# will result in charging user's account at 100 if DayFeeIsLastDay = yes
+# will result in charging user's account at 100 if DayFeeIsLastDay = yes
# and at 200, if DayFeeIsLastDay = no
# Parameter: required
# Values: yes, no
# Defines what will be written in the traffic cost in detail_stat.
# If user still has the prepaid traffic and WriteFreeMbTraffCost = no,
# then the traffic cost willn't be written in detail_stat.
-# If user doestn't have prepaid traffic and WriteFreeMbTraffCost = no,
+# If user doestn't have prepaid traffic and WriteFreeMbTraffCost = no,
# then the traffic cost will be written in detail_stat.
# When WriteFreeMbTraffCost = yes the traffic cost will be recorded in any case.
# Parameter: required
# Default: yes
WriteFreeMbTraffCost = yes
-# Charge a full monthly fee even if user was "frozen" a part
+# Charge a full monthly fee even if user was "frozen" a part
# of the tariffication period
# Parameter: optional
# Values: yes, no
# Default: no
FullFee = no
-# Allow user to see and use a full cash (yes) or hide a part of it (no)
+# Allow user to see and use a full cash (yes) or hide a part of it (no)
# for the next fee charge
# Parameter: optional
# Values: yes, no
</DirNames>
# Amount of stg-exec processes.
-# These processes are responsible for the execution of scripts OnConnect,
-# OnDisconnect, etc.
+# These processes are responsible for the execution of scripts OnConnect,
+# OnDisconnect, etc.
# Amount of processes means how many scripts can be executed simultaneously.
# Recommend to leave 1 to avoid errors when executing scripts
# Parameter: optional
# Directory where the "monitor" files are located.
# A blank files will be created in this directory. The modification time of such
-# files will be changed about once a minute. If server crashes or some of server
+# files will be changed about once a minute. If server crashes or some of server
# component hang, the files will stop refreshing, and on this basis we can define
-# the failure of the server and if necessary restart.
+# the failure of the server and if necessary restart.
# If option is omitted or blank, the monitoring is not performed.
# Parameter: optional
# Value: file path
RAISE EXCEPTION 'User % not found', _login;
RETURN -1;
END IF;
-
+
INSERT INTO tb_sessions_log
(fk_user,
event_time,
drop procedure sp_add_user;
set term !! ;
-create procedure sp_add_user(name varchar(32), dirs integer)
-as
+create procedure sp_add_user(name varchar(32), dirs integer)
+as
declare variable pk_user integer;
-declare variable pk_stat integer;
-begin
- pk_user = gen_id(gn_pk_user, 1);
+declare variable pk_stat integer;
+begin
+ pk_user = gen_id(gn_pk_user, 1);
insert into tb_users(pk_user, fk_tariff, fk_tariff_change, fk_corporation, address, always_online, credit, credit_expire, disabled, disabled_detail_stat, email, grp, note, passive, passwd, phone, name, real_name) values (:pk_user, NULL, NULL, NULL, '', 0, 0, 'now', 0, 0, '', '_', '', 0, '', '', :name, '');
- pk_stat = gen_id(gn_pk_stat, 1);
- insert into tb_stats values (:pk_stat, :pk_user, 0, 0, 'now', 0, 'now', 0, 'now');
+ pk_stat = gen_id(gn_pk_stat, 1);
+ insert into tb_stats values (:pk_stat, :pk_user, 0, 0, 'now', 0, 'now', 0, 'now');
while (dirs > 0) do
begin
insert into tb_stats_traffic (fk_stat, dir_num, upload, download) values (:pk_stat, :dirs - 1, 0, 0);
RAISE EXCEPTION 'User % not found', _login;
RETURN -1;
END IF;
-
+
INSERT INTO tb_sessions_log
(fk_user,
event_time,
* CREATE DATABASE 'localhost:/var/stg/stargazer.fdb' USER 'stg' PASSWORD '123456' DEFAULT CHARACTER SET UTF8;
*/
-
+
/*
*****************************************************************************
set term !! ;
create procedure sp_add_message(pk_message integer, login varchar(32), ver integer, msg_type integer, last_send_time integer, creation_time integer, show_time integer, repeat integer, repeat_period integer, msg_text varchar(256))
returns(res integer)
-as
+as
begin
if (:pk_message is null) then
begin
:ver,
:msg_type,
:last_send_time,
- :creation_time,
+ :creation_time,
:show_time,
:repeat,
:repeat_period,
insert into tb_tariffs (pk_tariff, name, fee, free, passive_cost, traff_type) values (:pk_tariff, :name, 0, 0, 0, 0);
while (dirs > 0) do
begin
- insert into tb_tariffs_params (fk_tariff, dir_num, price_day_a,
- price_day_b, price_night_a, price_night_b,
+ insert into tb_tariffs_params (fk_tariff, dir_num, price_day_a,
+ price_day_b, price_night_a, price_night_b,
threshold, time_day_begins, time_day_ends)
values (:pk_tariff, :dirs - 1, 0, 0, 0, 0, 0, '0:0', '0:0');
dirs = dirs - 1;
$Date: 2010/03/25 15:18:48 $
$Author: faust $
*/
-
+
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
-/* $Id: checksum.h,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
+/* $Id: checksum.h,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
Copyright (C) 2002 Marc Kirchner <kirchner@stud.fh-heilbronn.de>
/*
* Network Layer
-*/
+*/
#define PKT_NET_IP 0x01
#define PKT_NET_ICMP 0x02
#define PKT_NET_IGMP 0x04
-/* $Id: ip.c,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
+/* $Id: ip.c,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
Copyright (C) 2002 Marc Kirchner <kirchner@stud.fh-heilbronn.de>
if (!pkt)
return EPKTINVALPTR;
-
+
ip = (struct ip *) pkt->pkt_ptr;
ip->ip_hl = iphdr_len;
* packet payload pointer pkt. You do NOT want to do that. Use the provided
* library functions.
* To be clear: don't do _anything_ with this struct. Just pass it as a
-* parameter, be happy and your programs will (hopefully) work.
+* parameter, be happy and your programs will (hopefully) work.
*/
struct packet {
unsigned long pkt_type;
int rawfd;
struct sockaddr_in *sckad;
/*struct sockaddr_ll *sckll;*/
- socklen_t sckad_len;
+ socklen_t sckad_len;
};
/* memory management */
int pkt_tcp_cksum(struct packet *pkt, char *saddr, char *daddr, unsigned int tcp_pkt_size);
int pkt_tcp_option(struct packet *pkt, unsigned char kind, unsigned char len, void *optval, size_t optlen);
-/* functions that might be useful and might be added some day ...
+/* functions that might be useful and might be added some day ...
int pkt_shift_data(struct packet *pkt, unsigned int from, unsigned int to, unsigned int len);
int pkt_tcp_change_seqno(int rel_seq, int rel_ackseq);
int pkt_tcp_set_seqno(unsigned int seq, unsigned int ackseq);
-/* $Id: packet.c,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
+/* $Id: packet.c,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
Copyright (C) 2002 Marc Kirchner <kirchner@stud.fh-heilbronn.de>
/*
<++doc++>
-@name int pkt_move_actptr(struct packet *pkt, int relmov)
+@name int pkt_move_actptr(struct packet *pkt, int relmov)
@desc This function moves the active pointer inside the packet.
@param pkt the packet whose active ptr is to be moved
@param relmov number of bytes the active ptr shall be moved. To move it backward, negative values may be used.
<--doc-->
*/
-int
+int
pkt_move_actptr(struct packet *pkt, int relmov)
{
if (!pkt)
-/* $Id: tcp.c,v 1.2 2009/06/19 12:50:47 faust Exp $
+/* $Id: tcp.c,v 1.2 2009/06/19 12:50:47 faust Exp $
Copyright (C) 2002 Marc Kirchner <kirchner@stud.fh-heilbronn.de>
if (!pkt)
return EPKTINVALPTR;
-
+
tcp = (struct tcphdr *) pkt->pkt_ptr;
tcp->source = htons(sport);
tcp->dest = htons(dport);
# error "Adjust your <bits/endian.h> defines"
# endif
} else {
- tcp->fin = 0;
+ tcp->fin = 0;
tcp->syn = 0;
tcp->rst = 0;
- tcp->psh = 0;
+ tcp->psh = 0;
tcp->ack = 0;
tcp->urg = 0;
tcp->res2 = 0;
}
int
-pkt_tcp_cksum(struct packet *pkt, char *saddr, char *daddr,
+pkt_tcp_cksum(struct packet *pkt, char *saddr, char *daddr,
unsigned int tcp_pkt_size)
{
char *tosum;
if (!pkt || !saddr || !daddr)
return EPKTINVALPTR;
-
+
if ((tcp_pkt_size + pkt->pkt_pos) > pkt->pkt_size -1)
return EPKTRANGE;
-
+
if ((tosum = (char *) malloc(tcp_pkt_size+sizeof(struct pseudohdr))) != NULL) {
memset(tosum, 0, tcp_pkt_size+sizeof(struct pseudohdr));
psh = (struct pseudohdr *) tosum;
tcp = (struct tcphdr *) pkt->pkt_ptr;
tcp->check = 0;
-
+
if (inet_pton(AF_INET, saddr, &addr) < 0)
return EERRNO;
psh->saddr = addr.s_addr;
psh->zero = 0x00;
psh->protocol = IPPROTO_TCP;
psh->length = htons(tcp_pkt_size);
-
+
memcpy(tosum + sizeof(struct pseudohdr), tcp, tcp_pkt_size);
tcp->check = in_cksum((unsigned short *)tosum, tcp_pkt_size + sizeof(struct pseudohdr));
free(tosum);
} else
return EERRNO;
}
-
+
int
-pkt_tcp_option(struct packet *pkt, unsigned char kind,
+pkt_tcp_option(struct packet *pkt, unsigned char kind,
unsigned char len, void *optval, size_t optlen)
{
void *vp;
if (!pkt)
return EPKTINVALPTR;
-
+
if ((pkt->pkt_size) < (pkt->pkt_pos+2+optlen))
return EPKTRANGE;
-
+
vp = (void *)pkt->pkt_ptr;
memcpy(vp, &kind, 1);
-/* $Id: types.h,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
+/* $Id: types.h,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
Copyright (C) 2002 Marc Kirchner <kirchner@stud.fh-heilbronn.de>
static int ipq_errno = IPQ_ERR_NONE;
-static ssize_t ipq_netlink_sendto(const struct ipq_handle *h,
+static ssize_t ipq_netlink_sendto(const struct ipq_handle *h,
const void *msg, size_t len);
static ssize_t ipq_netlink_recvfrom(const struct ipq_handle *h,
ipq_peer_msg_t pm;
char s[FAKE_ARRAY_SIZE];
} req;
-
+
memset(&req, 0, sizeof(req));
req.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(req)-FAKE_ARRAY_SIZE);
req.nlh.nlmsg_flags = NLM_F_REQUEST;
* GNU General Public License for more details.
*
*/
-
+
#ifndef _LIBIPQ_H
#define _LIBIPQ_H
*retvalPtr = xmlrpc_c::value_boolean(true);
return;
}
-
+
*retvalPtr = xmlrpc_c::value_boolean(false);
return;
}
stgMIB MODULE-IDENTITY
LAST-UPDATED "201101060000Z"
ORGANIZATION "STG"
- CONTACT-INFO
+ CONTACT-INFO
"Primary Contact: Maxim Mamontov
- email: faust@stg.dp.ua"
+ email: stg@madf.info"
DESCRIPTION
"This MIB module defines objects for Stargazer data."
REVISION "201101060000Z"
asn_long2INTEGER(&msg->error_status, 0);
asn_long2INTEGER(&msg->error_index, 0);
-const VarBindList_t * vbl = &getRequest->variable_bindings;
+const VarBindList_t * vbl = &getRequest->variable_bindings;
for (int i = 0; i < vbl->list.count; ++i)
{
VarBind_t * vb = getRequest->variable_bindings.list.array[i];
asn_long2INTEGER(&msg->error_status, 0);
asn_long2INTEGER(&msg->error_index, 0);
-const VarBindList_t * vbl = &getRequest->variable_bindings;
+const VarBindList_t * vbl = &getRequest->variable_bindings;
for (int i = 0; i < vbl->list.count; ++i)
{
VarBind_t * vb = getRequest->variable_bindings.list.array[i];
printfd(__FILE__, "FILES_STORE::WriteDetailStat - chmod/chown failed for user '%s'. Error: '%s'\n", login.c_str(), strerror(errno));
}
-snprintf(dn, FN_STR_LEN, "%s/%s/detail_stat/%d/%s%d",
+snprintf(dn, FN_STR_LEN, "%s/%s/detail_stat/%d/%s%d",
storeSettings.GetUsersDir().c_str(),
login.c_str(),
lt->tm_year+1900,
int GetInt(const std::string & str, T * val, T defaultVal = T())
{
char *res;
-
+
*val = static_cast<T>(strtoll(str.c_str(), &res, 10));
-
- if (*res != 0)
+
+ if (*res != 0)
{
*val = defaultVal; //Error!
return EINVAL;
int GetDouble(const std::string & str, double * val, double defaultVal)
{
char *res;
-
+
*val = strtod(str.c_str(), &res);
-
- if (*res != 0)
+
+ if (*res != 0)
{
*val = defaultVal; //Error!
return EINVAL;
int GetTime(const std::string & str, time_t * val, time_t defaultVal)
{
char *res;
-
+
*val = strtol(str.c_str(), &res, 10);
-
- if (*res != 0)
+
+ if (*res != 0)
{
*val = defaultVal; //Error!
return EINVAL;
int GetULongLongInt(const std::string & str, uint64_t * val, uint64_t defaultVal)
{
char *res;
-
+
*val = strtoull(str.c_str(), &res, 10);
-
- if (*res != 0)
+
+ if (*res != 0)
{
*val = defaultVal; //Error!
return EINVAL;
}
return 0;
-}
+}
PLUGIN_CREATOR<MYSQL_STORE> msc;
}
return 0;
}
}
-
+
return ret;
}
//-----------------------------------------------------------------------------
if(mysql_select_db(sock, storeSettings.GetDBName().c_str()))
{
std::string res = "CREATE DATABASE " + storeSettings.GetDBName();
-
+
if(MysqlQuery(res.c_str(),sock))
{
errorStr = "Couldn't create database! With error:\n";
"ChgPassword TINYINT DEFAULT 0,ChgStat TINYINT DEFAULT 0,"\
"ChgCash TINYINT DEFAULT 0,UsrAddDel TINYINT DEFAULT 0,"\
"ChgTariff TINYINT DEFAULT 0,ChgAdmin TINYINT DEFAULT 0)");
-
+
if(MysqlQuery(qbuf,sock))
{
errorStr = "Couldn't create admin table list With error:\n";
sprintf(qbuf,"INSERT INTO admins SET login='admin',"\
"password='geahonjehjfofnhammefahbbbfbmpkmkmmefahbbbfbmpkmkmmefahbbbfbmpkmkaa',"\
"ChgConf=1,ChgPassword=1,ChgStat=1,ChgCash=1,UsrAddDel=1,ChgTariff=1,ChgAdmin=1");
-
+
if(MysqlQuery(qbuf,sock))
{
errorStr = "Couldn't create default admin. With error:\n";
if(!IsTablePresent("tariffs",sock))
{
res = "CREATE TABLE tariffs (name VARCHAR(40) DEFAULT '' PRIMARY KEY,";
-
+
for (int i = 0; i < DIR_NUM; i++)
{
- strprintf(¶m, " PriceDayA%d DOUBLE DEFAULT 0.0,", i);
+ strprintf(¶m, " PriceDayA%d DOUBLE DEFAULT 0.0,", i);
res += param;
-
+
strprintf(¶m, " PriceDayB%d DOUBLE DEFAULT 0.0,", i);
res += param;
-
+
strprintf(¶m, " PriceNightA%d DOUBLE DEFAULT 0.0,", i);
res += param;
-
+
strprintf(¶m, " PriceNightB%d DOUBLE DEFAULT 0.0,", i);
res += param;
-
+
strprintf(¶m, " Threshold%d INT DEFAULT 0,", i);
res += param;
-
+
strprintf(¶m, " Time%d VARCHAR(15) DEFAULT '0:0-0:0',", i);
res += param;
-
+
strprintf(¶m, " NoDiscount%d INT DEFAULT 0,", i);
res += param;
-
+
strprintf(¶m, " SinglePrice%d INT DEFAULT 0,", i);
res += param;
}
-
+
res += "PassiveCost DOUBLE DEFAULT 0.0, Fee DOUBLE DEFAULT 0.0,"
"Free DOUBLE DEFAULT 0.0, TraffType VARCHAR(10) DEFAULT '',"
"period VARCHAR(32) NOT NULL DEFAULT 'month',"
"change_policy VARCHAR(32) NOT NULL DEFAULT 'allow',"
"change_policy_timeout TIMESTAMP NOT NULL DEFAULT 0)";
-
+
if(MysqlQuery(res.c_str(),sock))
{
errorStr = "Couldn't create tariffs table list With error:\n";
}
res = "INSERT INTO tariffs SET name='tariff',";
-
+
for (int i = 0; i < DIR_NUM; i++)
{
strprintf(¶m, " NoDiscount%d=1,", i);
res += param;
-
+
strprintf(¶m, " Threshold%d=0,", i);
res += param;
-
+
strprintf(¶m, " Time%d='0:0-0:0',", i);
res += param;
-
+
if(i != 0 && i != 1)
{
strprintf(¶m, " SinglePrice%d=0,", i);
- res += param;
+ res += param;
}
-
+
if(i != 1)
{
- strprintf(¶m, " PriceDayA%d=0.0,", i);
- res += param;
+ strprintf(¶m, " PriceDayA%d=0.0,", i);
+ res += param;
}
if(i != 1)
{
- strprintf(¶m, " PriceDayB%d=0.0,", i);
- res += param;
+ strprintf(¶m, " PriceDayB%d=0.0,", i);
+ res += param;
}
-
+
if(i != 0)
{
- strprintf(¶m, " PriceNightA%d=0.0,", i);
- res += param;
+ strprintf(¶m, " PriceNightA%d=0.0,", i);
+ res += param;
}
if(i != 0)
{
- strprintf(¶m, " PriceNightB%d=0.0,", i);
- res += param;
+ strprintf(¶m, " PriceNightB%d=0.0,", i);
+ res += param;
}
}
-
+
res += "PassiveCost=0.0, Fee=10.0, Free=0,"\
"SinglePrice0=1, SinglePrice1=1,PriceDayA1=0.75,PriceDayB1=0.75,"\
"PriceNightA0=1.0,PriceNightB0=1.0,TraffType='up+down',period='month',"\
"change_policy='allow', change_policy_timeout=0";
-
+
if(MysqlQuery(res.c_str(),sock))
{
errorStr = "Couldn't create default tariff. With error:\n";
"Address VARCHAR(254) NOT NULL DEFAULT '',Phone VARCHAR(128) NOT NULL DEFAULT '',Email VARCHAR(50) NOT NULL DEFAULT '',"\
"Note TEXT NOT NULL,RealName VARCHAR(254) NOT NULL DEFAULT '',StgGroup VARCHAR(40) NOT NULL DEFAULT '',"\
"Credit DOUBLE DEFAULT 0, TariffChange VARCHAR(40) NOT NULL DEFAULT '',";
-
+
for (int i = 0; i < USERDATA_NUM; i++)
{
strprintf(¶m, " Userdata%d VARCHAR(254) NOT NULL,", i);
res += param;
}
-
+
param = " CreditExpire INT(11) DEFAULT 0,";
res += param;
-
+
strprintf(¶m, " IP VARCHAR(254) DEFAULT '*',");
res += param;
-
+
for (int i = 0; i < DIR_NUM; i++)
{
strprintf(¶m, " D%d BIGINT(30) DEFAULT 0,", i);
res += param;
-
+
strprintf(¶m, " U%d BIGINT(30) DEFAULT 0,", i);
res += param;
}
-
+
strprintf(¶m, "Cash DOUBLE DEFAULT 0,FreeMb DOUBLE DEFAULT 0,LastCashAdd DOUBLE DEFAULT 0,"\
"LastCashAddTime INT(11) DEFAULT 0,PassiveTime INT(11) DEFAULT 0,LastActivityTime INT(11) DEFAULT 0,"\
"NAS VARCHAR(17) NOT NULL, INDEX (AlwaysOnline), INDEX (IP), INDEX (Address),"\
" INDEX (Tariff),INDEX (Phone),INDEX (Email),INDEX (RealName))");
res += param;
-
+
if(MysqlQuery(res.c_str(),sock))
{
errorStr = "Couldn't create users table list With error:\n";
"Credit=0.0,CreditExpire=0,Down=0,Email='',DisabledDetailStat=0,"\
"StgGroup='',IP='192.168.1.1',Note='',Passive=0,Password='123456',"\
"Phone='', RealName='',Tariff='tariff',TariffChange='',NAS='',";
-
+
for (int i = 0; i < USERDATA_NUM; i++)
{
strprintf(¶m, " Userdata%d='',", i);
res += param;
}
-
+
for (int i = 0; i < DIR_NUM; i++)
{
strprintf(¶m, " D%d=0,", i);
res += param;
-
+
strprintf(¶m, " U%d=0,", i);
res += param;
}
-
+
res += "Cash=10.0,FreeMb=0.0,LastActivityTime=0,LastCashAdd=0,"\
"LastCashAddTime=0, PassiveTime=0";
-
+
if(MysqlQuery(res.c_str(),sock))
{
errorStr = "Couldn't create default user. With error:\n";
if(!IsTablePresent("logs"))
{
sprintf(qbuf,"CREATE TABLE logs (unid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(40),text TEXT)");
-
+
if(MysqlQuery(qbuf))
{
errorStr = "Couldn't create admin table list With error:\n";
sprintf(qbuf,"CREATE TABLE messages (login VARCHAR(40) DEFAULT '', id BIGINT, "\
"type INT, lastSendTime INT, creationTime INT, showTime INT,"\
"stgRepeat INT, repeatPeriod INT, text TEXT)");
-
+
if(MysqlQuery(qbuf,sock))
{
errorStr = "Couldn't create messages table. With error:\n";
if(!IsTablePresent("stat",sock))
{
res = "CREATE TABLE stat (login VARCHAR(50), month TINYINT, year SMALLINT,";
-
+
for (int i = 0; i < DIR_NUM; i++)
{
- strprintf(¶m, " U%d BIGINT,", i);
+ strprintf(¶m, " U%d BIGINT,", i);
res += param;
-
- strprintf(¶m, " D%d BIGINT,", i);
+
+ strprintf(¶m, " D%d BIGINT,", i);
res += param;
}
-
+
res += " cash DOUBLE, INDEX (login))";
-
+
if(MysqlQuery(res.c_str(),sock))
{
errorStr = "Couldn't create stat table. With error:\n";
}
//-----------------------------------------------------------------------------
-int MYSQL_STORE::GetAllParams(std::vector<std::string> * ParamList,
+int MYSQL_STORE::GetAllParams(std::vector<std::string> * ParamList,
const std::string & table, const std::string & name) const
{
MYSQL_RES *res;
MYSQL_ROW row;
MYSQL * sock=NULL;
my_ulonglong num, i;
-
+
ParamList->clear();
-
+
sprintf(qbuf,"SELECT %s FROM %s", name.c_str(), table.c_str());
-
+
if(MysqlGetQuery(qbuf,sock))
{
errorStr = "Couldn't GetAllParams Query for: ";
for(i = 0; i < num; i++)
{
- row = mysql_fetch_row(res);
+ row = mysql_fetch_row(res);
ParamList->push_back(row[0]);
}
int MYSQL_STORE::DelUser(const std::string & login) const
{
sprintf(qbuf,"DELETE FROM users WHERE login='%s' LIMIT 1", login.c_str());
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't delete user:\n";
query += login + "' LIMIT 1";
//sprintf(qbuf,"SELECT * FROM users WHERE login='%s' LIMIT 1", login.c_str());
-
+
if(MysqlGetQuery(query.c_str(),sock))
{
errorStr = "Couldn't restore Tariff(on query):\n";
conf->tariffName = row[6];
-if (conf->tariffName.empty())
+if (conf->tariffName.empty())
{
mysql_free_result(res);
errorStr = "User \'" + login + "\' tariff is blank.";
}
GetTime(row[15+USERDATA_NUM], &conf->creditExpire, 0);
-
+
std::string ipStr = row[16+USERDATA_NUM];
USER_IPS i;
try
query += login + "'";
//sprintf(qbuf,"SELECT * FROM users WHERE login='%s' LIMIT 1", login.c_str());
-
+
if(MysqlGetQuery(query.c_str() ,sock))
{
errorStr = "Couldn't restore UserStat(on query):\n";
strprintf(&res,"UPDATE users SET Password='%s', Passive=%d, Down=%d, DisabledDetailStat = %d, "\
"AlwaysOnline=%d, Tariff='%s', Address='%s', Phone='%s', Email='%s', "\
- "Note='%s', RealName='%s', StgGroup='%s', Credit=%f, TariffChange='%s', ",
+ "Note='%s', RealName='%s', StgGroup='%s', Credit=%f, TariffChange='%s', ",
conf.password.c_str(),
conf.passive,
conf.disabled,
for (int i = 0; i < USERDATA_NUM; i++)
{
- strprintf(¶m, " Userdata%d='%s',", i,
+ strprintf(¶m, " Userdata%d='%s',", i,
(ReplaceStr(conf.userdata[i],badSyms,repSym)).c_str());
res += param;
}
-
+
strprintf(¶m, " CreditExpire=%d,", conf.creditExpire);
res += param;
}
strprintf(¶m, " Cash=%f, FreeMb=%f, LastCashAdd=%f, LastCashAddTime=%d,"\
- " PassiveTime=%d, LastActivityTime=%d",
+ " PassiveTime=%d, LastActivityTime=%d",
stat.cash,
stat.freeMb,
stat.lastCashAdd,
{
sprintf(qbuf,"CREATE TABLE logs_%02d_%4d (unid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(40),text TEXT)",
lt->tm_mon+1, lt->tm_year+1900);
-
+
if(MysqlQuery(qbuf,sock))
{
errorStr = "Couldn't create WriteDetailedStat table:\n";
return WriteLogString(logStr, login);
}
//-----------------------------------------------------------------------------
-int MYSQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year,
+int MYSQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year,
const std::string & login) const
{
std::string param, res;
-strprintf(&res, "INSERT INTO stat SET login='%s', month=%d, year=%d,",
+strprintf(&res, "INSERT INTO stat SET login='%s', month=%d, year=%d,",
login.c_str(), month+1, year+1900);
-
+
for (int i = 0; i < DIR_NUM; i++)
{
- strprintf(¶m, " U%d=%lld,", i, stat.monthUp[i]);
+ strprintf(¶m, " U%d=%lld,", i, stat.monthUp[i]);
res += param;
- strprintf(¶m, " D%d=%lld,", i, stat.monthDown[i]);
+ strprintf(¶m, " D%d=%lld,", i, stat.monthDown[i]);
res += param;
}
-
-strprintf(¶m, " cash=%f", stat.cash);
+
+strprintf(¶m, " cash=%f", stat.cash);
res += param;
if(MysqlSetQuery(res.c_str()))
int MYSQL_STORE::AddAdmin(const std::string & login) const
{
sprintf(qbuf,"INSERT INTO admins SET login='%s'", login.c_str());
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't add admin:\n";
int MYSQL_STORE::DelAdmin(const std::string & login) const
{
sprintf(qbuf,"DELETE FROM admins where login='%s' LIMIT 1", login.c_str());
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't delete admin:\n";
sprintf(qbuf,"UPDATE admins SET password='%s', ChgConf=%d, ChgPassword=%d, "\
"ChgStat=%d, ChgCash=%d, UsrAddDel=%d, ChgTariff=%d, ChgAdmin=%d "\
- "WHERE login='%s' LIMIT 1",
+ "WHERE login='%s' LIMIT 1",
passwordE,
ac.priv.userConf,
ac.priv.userPasswd,
MYSQL_ROW row;
MYSQL * sock;
sprintf(qbuf,"SELECT * FROM admins WHERE login='%s' LIMIT 1", login.c_str());
-
+
if(MysqlGetQuery(qbuf,sock))
{
errorStr = "Couldn't restore admin:\n";
mysql_close(sock);
return -1;
}
-
+
row = mysql_fetch_row(res);
p = row[1];
uint16_t a;
-if (GetInt(row[2], &a) == 0)
+if (GetInt(row[2], &a) == 0)
ac->priv.userConf = a;
else
{
return -1;
}
-if (GetInt(row[3], &a) == 0)
+if (GetInt(row[3], &a) == 0)
ac->priv.userPasswd = a;
else
{
return -1;
}
-if (GetInt(row[4], &a) == 0)
+if (GetInt(row[4], &a) == 0)
ac->priv.userStat = a;
else
{
return -1;
}
-if (GetInt(row[5], &a) == 0)
+if (GetInt(row[5], &a) == 0)
ac->priv.userCash = a;
else
{
return -1;
}
-if (GetInt(row[6], &a) == 0)
+if (GetInt(row[6], &a) == 0)
ac->priv.userAddDel = a;
else
{
return -1;
}
-if (GetInt(row[7], &a) == 0)
+if (GetInt(row[7], &a) == 0)
ac->priv.tariffChg = a;
else
{
return -1;
}
-if (GetInt(row[8], &a) == 0)
+if (GetInt(row[8], &a) == 0)
ac->priv.adminChg = a;
else
{
int MYSQL_STORE::AddTariff(const std::string & name) const
{
sprintf(qbuf,"INSERT INTO tariffs SET name='%s'", name.c_str());
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't add tariff:\n";
int MYSQL_STORE::DelTariff(const std::string & name) const
{
sprintf(qbuf,"DELETE FROM tariffs WHERE name='%s' LIMIT 1", name.c_str());
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't delete tariff: ";
MYSQL_ROW row;
MYSQL * sock;
sprintf(qbuf,"SELECT * FROM tariffs WHERE name='%s' LIMIT 1", tariffName.c_str());
-
+
if(MysqlGetQuery(qbuf,sock))
{
errorStr = "Couldn't restore Tariff:\n";
return -1;
}
- ParseTariffTimeStr(str.c_str(),
- td->dirPrice[i].hDay,
- td->dirPrice[i].mDay,
- td->dirPrice[i].hNight,
+ ParseTariffTimeStr(str.c_str(),
+ td->dirPrice[i].hDay,
+ td->dirPrice[i].mDay,
+ td->dirPrice[i].hNight,
td->dirPrice[i].mNight);
strprintf(¶m, "PriceDayA%d", i);
str = row[4+8*DIR_NUM];
param = "TraffType";
-
+
if (str.length() == 0)
{
mysql_free_result(res);
for (int i = 0; i < DIR_NUM; i++)
{
- strprintf(¶m, " PriceDayA%d=%f,", i,
+ strprintf(¶m, " PriceDayA%d=%f,", i,
td.dirPrice[i].priceDayA * pt_mega);
res += param;
- strprintf(¶m, " PriceDayB%d=%f,", i,
- td.dirPrice[i].priceDayB * pt_mega);
+ strprintf(¶m, " PriceDayB%d=%f,", i,
+ td.dirPrice[i].priceDayB * pt_mega);
res += param;
-
+
strprintf(¶m, " PriceNightA%d=%f,", i,
td.dirPrice[i].priceNightA * pt_mega);
res += param;
- strprintf(¶m, " PriceNightB%d=%f,", i,
+ strprintf(¶m, " PriceNightB%d=%f,", i,
td.dirPrice[i].priceNightB * pt_mega);
res += param;
-
- strprintf(¶m, " Threshold%d=%d,", i,
+
+ strprintf(¶m, " Threshold%d=%d,", i,
td.dirPrice[i].threshold);
res += param;
std::string s;
strprintf(¶m, " Time%d", i);
- strprintf(&s, "%0d:%0d-%0d:%0d",
+ strprintf(&s, "%0d:%0d-%0d:%0d",
td.dirPrice[i].hDay,
td.dirPrice[i].mDay,
td.dirPrice[i].hNight,
res += (param + "='" + s + "',");
- strprintf(¶m, " NoDiscount%d=%d,", i,
+ strprintf(¶m, " NoDiscount%d=%d,", i,
td.dirPrice[i].noDiscount);
res += param;
- strprintf(¶m, " SinglePrice%d=%d,", i,
+ strprintf(¶m, " SinglePrice%d=%d,", i,
td.dirPrice[i].singlePrice);
res += param;
}
return 0;
}
//-----------------------------------------------------------------------------
-int MYSQL_STORE::WriteDetailedStat(const std::map<IP_DIR_PAIR, STAT_NODE> & statTree,
- time_t lastStat,
+int MYSQL_STORE::WriteDetailedStat(const std::map<IP_DIR_PAIR, STAT_NODE> & statTree,
+ time_t lastStat,
const std::string & login) const
{
std::string res, stTime, endTime, tempStr;
"IP VARCHAR(17) DEFAULT '',dir INT DEFAULT 0,"\
"down BIGINT DEFAULT 0,up BIGINT DEFAULT 0, cash DOUBLE DEFAULT 0.0, INDEX (login), INDEX(dir), INDEX(day), INDEX(IP))",
lt->tm_mon+1, lt->tm_year+1900);
-
+
if(MysqlQuery(qbuf,sock))
{
errorStr = "Couldn't create WriteDetailedStat table:\n";
h2 = lt2->tm_hour;
m2 = lt2->tm_min;
s2 = lt2->tm_sec;
-
+
strprintf(&stTime, "%02d:%02d:%02d", h1, m1, s1);
strprintf(&endTime, "%02d:%02d:%02d", h2, m2, s2);
strprintf(&res,"INSERT INTO detailstat_%02d_%4d SET login='%s',"\
- "day=%d,startTime='%s',endTime='%s',",
+ "day=%d,startTime='%s',endTime='%s',",
lt->tm_mon+1, lt->tm_year+1900,
login.c_str(),
lt->tm_mday,
while (stIter != statTree.end())
{
- strprintf(&tempStr,"IP='%s', dir=%d, down=%lld, up=%lld, cash=%f",
+ strprintf(&tempStr,"IP='%s', dir=%d, down=%lld, up=%lld, cash=%f",
inet_ntostring(stIter->first.ip).c_str(),
- stIter->first.dir,
- stIter->second.down,
- stIter->second.up,
+ stIter->first.dir,
+ stIter->second.down,
+ stIter->second.up,
stIter->second.cash
);
-
+
if( MysqlQuery((res+tempStr).c_str(),sock) )
{
errorStr = "Couldn't insert data in WriteDetailedStat:\n";
msg->header.id = static_cast<uint64_t>(tv.tv_sec) * 1000000 + static_cast<uint64_t>(tv.tv_usec);
-sprintf(qbuf,"INSERT INTO messages SET login='%s', id=%lld",
+sprintf(qbuf,"INSERT INTO messages SET login='%s', id=%lld",
login.c_str(),
static_cast<long long>(msg->header.id)
);
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't add message:\n";
strprintf(&res,"UPDATE messages SET type=%d, lastSendTime=%u, creationTime=%u, "\
"showTime=%u, stgRepeat=%d, repeatPeriod=%u, text='%s' "\
- "WHERE login='%s' AND id=%lld LIMIT 1",
+ "WHERE login='%s' AND id=%lld LIMIT 1",
msg.header.type,
msg.header.lastSendTime,
msg.header.creationTime,
sprintf(qbuf,"SELECT * FROM messages WHERE login='%s' AND id=%llu LIMIT 1",
login.c_str(), static_cast<unsigned long long>(id));
-
+
if(MysqlGetQuery(qbuf,sock))
{
errorStr = "Couldn't GetMessage:\n";
//-----------------------------------------------------------------------------
int MYSQL_STORE::DelMessage(uint64_t id, const std::string & login) const
{
-sprintf(qbuf,"DELETE FROM messages WHERE login='%s' AND id=%lld LIMIT 1",
+sprintf(qbuf,"DELETE FROM messages WHERE login='%s' AND id=%lld LIMIT 1",
login.c_str(), static_cast<long long>(id));
-
+
if(MysqlSetQuery(qbuf))
{
errorStr = "Couldn't delete Message:\n";
MYSQL_ROW row;
MYSQL * sock;
sprintf(qbuf,"SELECT * FROM messages WHERE login='%s'", login.c_str());
-
+
if(MysqlGetQuery(qbuf,sock))
{
errorStr = "Couldn't GetMessageHdrs:\n";
row = mysql_fetch_row(res);
if (str2x(row[1], id))
continue;
-
+
STG_MSG_HDR hdr;
- if (row[2])
+ if (row[2])
if(str2x(row[2], hdr.type))
continue;
const MODULE_SETTINGS * settings;
- int ParseParam(const std::vector<PARAM_VALUE> & moduleParams,
+ int ParseParam(const std::vector<PARAM_VALUE> & moduleParams,
const std::string & name, std::string & result);
std::string errorStr;
for ys in $usr/detail_stat/*
do
year=`basename $ys`
-
+
for ms in $ys/*
do
month=`basename $ms`
- stat_time=`date --date="$year/$month/01" +%s`
-
+ stat_time=`date --date="$year/$month/01" +%s`
+
if (( $NOW - $stat_time > $DT ))
then
rm -fr $ms
#!/bin/bash
-# Данный скрипт производит мониторинг СТГ-сервера на зависание и в
+# Данный скрипт производит мониторинг СТГ-сервера на зависание и в
# случае его зависания перезапускает.
# Для работы скрипта в настройках СТГ должен быть указан параметер
-# MonitorDir
-# Скрипт отрабатывает один раз и выходит. Т.е. он не работает постоянно
+# MonitorDir
+# Скрипт отрабатывает один раз и выходит. Т.е. он не работает постоянно
# и следит за СТГ. Его нужно вызывать по крону или как-то еще с нужной
# периодичностью!!!
-# Путь к файлам монитора. Должен совпадать со значением MonitorDir
+# Путь к файлам монитора. Должен совпадать со значением MonitorDir
# в настройках сервера
MONITOR_DIR=/var/stargazer/monitor/
# Максимальная задержка обновления файлов монитора в секундах.
-# При привышении этого значения сервер считается зависшим и будет
+# При привышении этого значения сервер считается зависшим и будет
# перезапущен
DT=300
fi
file_time=`stat -c%Y $mon`
- if (( $now - $file_time > $DT ))
+ if (( $now - $file_time > $DT ))
then
echo "Stargazer is deadlocked!"
-
+
# Команда остаовки СТГ
killall -KILL stargazer
-
+
rm -f $MONITOR_DIR/*
sleep 15
-
+
# Команда запуска СТГ
/etc/init.d/stargazer start
-
+
fi
-
+
done
# maximum) speedkb=512kbit;; # 512 kbit
# *) speedkb=$default_speed;; # default speed
#esac
-# ========= shaping by tariff end =========
+# ========= shaping by tariff end =========
# ========= shaping by userdata0 ==========
speedR=$(grep -i "^Userdata0=" /var/stargazer/users/$LOGIN/conf | cut -f 2 -d"=")
speed=$(echo $speedR | grep "^[0-9]*[0-9]$")
-if [ -z "$speed" ]
+if [ -z "$speed" ]
then
speedkb=$default_speed
else
По мотивам форума:
http://local.com.ua/forum/index.php?showtopic=7920
-Настройка сводится к указанию сетевого интерфейса, обращенного к пользователю
-в скриптах shaper.sh, shaper.stop.sh, OnConnect и OnDisconnect, и уточнению
+Настройка сводится к указанию сетевого интерфейса, обращенного к пользователю
+в скриптах shaper.sh, shaper.stop.sh, OnConnect и OnDisconnect, и уточнению
скоростоей и тарифов в скрипте OnConnect (если нужно).
-Скрипты сделаны для БД на файлах, однако, сделать их для БД на Firebird или
+Скрипты сделаны для БД на файлах, однако, сделать их для БД на Firebird или
MySQL не составит большого труда.
В OnConnect есть два типа шейпинга.
-1. На основании тарифа. Т.е. для каждого тарифа у задана скорость и задано
-дефолтное значение, на случай отсутсвия тарифа в списке скоростей или
+1. На основании тарифа. Т.е. для каждого тарифа у задана скорость и задано
+дефолтное значение, на случай отсутсвия тарифа в списке скоростей или
забывчивости админа.
-2. На основании Userdata0. В этом поле просто прописывается число равное
-скорости в kbit/sec. Также есть дефолтное значение скорости в 32 kbit/sec
+2. На основании Userdata0. В этом поле просто прописывается число равное
+скорости в kbit/sec. Также есть дефолтное значение скорости в 32 kbit/sec
на случай отсутсвия в Userdata0 корректного значения.
В скрипте первый способ закомментирован. Для того чтобы выбрать один из них нужно
Скрипт shaper.sh должен быть выполнен один раз при загрузке системы.
Интерфейс обращенный к пользователю определяется в переменной
-int_iface=
-(присутствует во всех 4-х файлах shaper.sh, shaper.stop.sh, OnConnect и
+int_iface=
+(присутствует во всех 4-х файлах shaper.sh, shaper.stop.sh, OnConnect и
OnDisconnect !!!)
Скорость по умолчанию в OnConnect в переменной default_speed
*) speedkb=$default_speed;;
esac
-Т.е. тут нужно вместо minimum, ... maximum подставить имена ваших тарифов
-и соотв. скорость. Пользователи с тарифами не указанными в списке будут иметь
+Т.е. тут нужно вместо minimum, ... maximum подставить имена ваших тарифов
+и соотв. скорость. Пользователи с тарифами не указанными в списке будут иметь
дефолтную скорость.
-Скорость ограничевается только для входящего тарафика, однако расширить
+Скорость ограничевается только для входящего тарафика, однако расширить
эти скрипты для исходящего не составит труда.
<M> PPP MPPE compression (encryption) (EXPERIMENTAL)
<M> PPP over Ethernet (EXPERIMENTAL)
В файле /etc/pptpd.conf прописываем файл настроек PPP (параметр option). Также
-указываем адреса сервера внутри сети VPN (параметр localip) и диапазон адресов
+указываем адреса сервера внутри сети VPN (параметр localip) и диапазон адресов
клиентов (параметр remoteip). См. пример файла конфигурации.
-В настройках PPP указываем имя сервера (параметр name), параметры шифрования.
-Для использования шифрования MPPE необходима его поддержка в ядре. Кроме того,
-в процессе аутентификации MPPE использует MS-CHAPv2. По этому при
-использовании шифрования MPPE также необходимо указать необходимость
-поддержки MS-CHAPv2 клиентом. По желанию указываем proxyarp (для того чтобы
-клиенты в сети VPN "видели" друг друга) и defaultroute. Прописываем в файле
-/etc/ppp/chap-secrets тестового пользователя и проверяем работоспособность
+В настройках PPP указываем имя сервера (параметр name), параметры шифрования.
+Для использования шифрования MPPE необходима его поддержка в ядре. Кроме того,
+в процессе аутентификации MPPE использует MS-CHAPv2. По этому при
+использовании шифрования MPPE также необходимо указать необходимость
+поддержки MS-CHAPv2 клиентом. По желанию указываем proxyarp (для того чтобы
+клиенты в сети VPN "видели" друг друга) и defaultroute. Прописываем в файле
+/etc/ppp/chap-secrets тестового пользователя и проверяем работоспособность
VPN.
2. Настройка авторизации VPN через FreeRADIUS
Необходимо установить пакет freeradius.
-Настройку сервера (файл radiusd.conf) проводим в соответствии с документацией
+Настройку сервера (файл radiusd.conf) проводим в соответствии с документацией
на модуль rlm_stg.so (см. документацию на систему Stargazer).
-Настройку Stargazer с плагином для FreeRADIUS проводим в соответствиии с
+Настройку Stargazer с плагином для FreeRADIUS проводим в соответствиии с
документацией на модуль mod_radius.so (см. документацию на систему Stargazer).
-В файле clients.conf, расположенном в дирректории с конфигурационными файлами
-FreeRADIUS, описываем, какие клиенты могут использовать FreeRADIUS.
-Рекомендуется заменить стандартный пароль, которым шифруется обмен информации
-с клиентом, "testing123" на что-то более приемлимое с точки зрения безопасности.
-После этого запускаем FreeRADIUS и удостоверяемся, что он работает строчкой
-"Mon Mar 31 16:06:17 2008 : Info: Ready to process requests." в журнале
-(обычно, /var/log/radius/radius.log). Если журнал FreeRADIUS не позволяет
-определить проблему - можно запустить сервер в отладочном режме с ключем -X.
+В файле clients.conf, расположенном в дирректории с конфигурационными файлами
+FreeRADIUS, описываем, какие клиенты могут использовать FreeRADIUS.
+Рекомендуется заменить стандартный пароль, которым шифруется обмен информации
+с клиентом, "testing123" на что-то более приемлимое с точки зрения безопасности.
+После этого запускаем FreeRADIUS и удостоверяемся, что он работает строчкой
+"Mon Mar 31 16:06:17 2008 : Info: Ready to process requests." в журнале
+(обычно, /var/log/radius/radius.log). Если журнал FreeRADIUS не позволяет
+определить проблему - можно запустить сервер в отладочном режме с ключем -X.
В этом режиме более детальное журналирование проводится в консоль.
-Если на данном этапе все работает - в файл насттроек PPP прописываем строчку
-plugin radius.so. После этого VPN должен нормально авторизоваться
+Если на данном этапе все работает - в файл насттроек PPP прописываем строчку
+plugin radius.so. После этого VPN должен нормально авторизоваться
пользователями системы Stargazer.
3. Настройка шейпера
-Собственно настройки шейпер не требует. Всё, что нужно прописано в скриптах
-OnConnect и OnDisconnect. Шейпер предназначен для работы с хранилищем на
+Собственно настройки шейпер не требует. Всё, что нужно прописано в скриптах
+OnConnect и OnDisconnect. Шейпер предназначен для работы с хранилищем на
файлах, однако, переделать скипт под MySQL или Firebird не составит труда.
-Скорость для пользоватлея задается в поле Userdata0 в kbit/sec. В этом поле
+Скорость для пользоватлея задается в поле Userdata0 в kbit/sec. В этом поле
должно быть прописано просто число без всяких kbit/sec и т.п. Если в этом поле
-у пользователя нет данных или стоит некорректное значение, пользователь будет
-ограничен скоростью определенной в переменной default_speed в скрипте
+у пользователя нет данных или стоит некорректное значение, пользователь будет
+ограничен скоростью определенной в переменной default_speed в скрипте
OnConnect.
iptables -t nat -F
iptables -t filter -F
-#
+#
#iptables -A INPUT -d $ip1 -j ACCEPT
#iptables -A OUTPUT -s $ip1 -j ACCEPT
#
usercollide = no
-# lower_user / lower_pass:
+# lower_user / lower_pass:
# Lower case the username/password "before" or "after"
-# attempting to authenticate.
+# attempting to authenticate.
#
# If "before", the server will first modify the request and then try
# to auth the user. If "after", the server will first auth using the
# Normally this should be set to "no", because they're useless.
# See: http://www.freeradius.org/rfc/rfc2865.html#Keep-Alives
#
- # However, certain NAS boxes may require them.
+ # However, certain NAS boxes may require them.
#
# When sent a Status-Server message, the server responds with
# an Access-Accept packet, containing a Reply-Message attribute,
# CLIENTS CONFIGURATION
#
-# Client configuration is defined in "clients.conf".
+# Client configuration is defined in "clients.conf".
#
# The 'clients.conf' file contains all of the information from the old
# or repeat values for Acct-Session-Id, causing no end of
# confusion.
#
- # This module will add a (probably) unique session id
+ # This module will add a (probably) unique session id
# to an accounting packet based on the attributes listed
# below found in the packet. See doc/rlm_acct_unique for
# more information.
# If we want to believe the 'utmp' file, then this
# configuration entry can be set to 'no'.
#
- check_with_nas = yes
+ check_with_nas = yes
# Set the file permissions, as the contents of this file
# are usually private.
# The order of the realm modules will determine the order that
# we try to find a matching realm.
#
-# Make *sure* that 'preprocess' comes before any realm if you
+# Make *sure* that 'preprocess' comes before any realm if you
# need to setup hints for the remote radius server
authorize {
#
}
-# Session database, used for checking Simultaneous-Use. Either the radutmp
+# Session database, used for checking Simultaneous-Use. Either the radutmp
# or rlm_sql module can handle this.
# The rlm_sql module is *much* faster
session {
# Authentication
-# Name of the local system for authentication purposes
+# Name of the local system for authentication purposes
# (must match the second field in /etc/ppp/chap-secrets entries)
name pptpd
lock
# Disable BSD-Compress compression
-nobsdcomp
-plugin radius.so
\ No newline at end of file
+nobsdcomp
+plugin radius.so
# 1. No spaces are permitted between commas or within addresses.
#
# 2. If you give more IP addresses than MAX_CONNECTIONS, it will
-# start at the beginning of the list and go until it gets
+# start at the beginning of the list and go until it gets
# MAX_CONNECTIONS IPs. Others will be ignored.
#
# 3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238,
#!/bin/bash
#Этот скрипт вызывается в момент, когда пользователь
-#успешно прошел авторизацию на сервере. Задача скрипта - перестроить
+#успешно прошел авторизацию на сервере. Задача скрипта - перестроить
#файрвол так, что бы пользователь получил доступ в интернет
# Login
#echo "speedR=$speedR" >> /var/stargazer/users/$LOGIN/connect.log
speed=$(echo $speedR | grep "^[0-9]*[0-9]$")
-if [ -z "$speed" ]
+if [ -z "$speed" ]
then
speed=$default_speed
fi
# Этот скрипт вызывается в момент, когда пользователь
# желает отключится от интернета или вышел таймаут у пользователя
# и сервер сам отключает пользователя
-# Задача скрипта подобна задаче скрипта OnConnect - перестроить
+# Задача скрипта подобна задаче скрипта OnConnect - перестроить
# файрвол так, что бы пользователю закрыть доступ в интернет
# Login
# Использование (неиспользование) этого скрипта дело вкуса.
# Он не выполняет критических функций. Его задача автматизировать
-# действия характерные при добавлении пользователя сети, например добавлекние
+# действия характерные при добавлении пользователя сети, например добавлекние
# пользователю почты
# Login
-ALL 192.168.0.0/16 DIR1
+ALL 192.168.0.0/16 DIR1
ALL 10.0.0.0/8 DIR2
-ALL 0.0.0.0/0 DIR0
\ No newline at end of file
+ALL 0.0.0.0/0 DIR0
# По умолчанию установлен в no
# FullFee=no
-# Необязательный параметр указывающий показывать на счету и позволять
+# Необязательный параметр указывающий показывать на счету и позволять
# использовать пользователю абонплату. По умолчанию установлен в yes
# ShowFeeInCash=yes
ModulesPath = /usr/lib/stg
# Определяет директорию, в которой будут находится файлы "монитора"
-# работы сервера. В этой директории будут созданы пустые файлы, время
-# модификации которых будет меняться примерно раз в минуту. Если какой-то
-# компонент сервера зависнет, файл(ы) перестанет обновлятся, и по этому
-# признаку можно определить сбой в работе сервера и при надобности
-# перезапустить. Если параметр не указан или пустой, мониторинг производится
+# работы сервера. В этой директории будут созданы пустые файлы, время
+# модификации которых будет меняться примерно раз в минуту. Если какой-то
+# компонент сервера зависнет, файл(ы) перестанет обновлятся, и по этому
+# признаку можно определить сбой в работе сервера и при надобности
+# перезапустить. Если параметр не указан или пустой, мониторинг производится
# не будет. Параметр не является обязательным, по умолчанию пустой.
# MonitorDir=/var/stargazer/monitor
PingDelay = 15
</Module>
-
+
<Module radius>
Password = 123456
ServerIP = 127.0.0.1
const std::string & GetRulesFileName() const { return rules; }
const std::string & GetLogFileName() const { return logFile; }
const std::string & GetPIDFileName() const { return pidFile; }
- unsigned GetDetailStatWritePeriod() const
- { return detailStatWritePeriod; }
+ unsigned GetDetailStatWritePeriod() const
+ { return detailStatWritePeriod; }
unsigned GetStatWritePeriod() const { return statWritePeriod * 60; }
unsigned GetDayFee() const { return dayFee; }
bool GetFullFee() const { return fullFee; }
#include "mempool.h"
DOTCONFDocumentNode::DOTCONFDocumentNode():previousNode(NULL), nextNode(NULL), parentNode(NULL), childNode(NULL),
- values(NULL), valuesCount(0),
+ values(NULL), valuesCount(0),
name(NULL), lineNum(0), fileName(NULL), closed(true)
{
}
*line = ' ';continue;
}
if(*line == '\\' && (*(line+1) == '"' || *(line+1) == '\'')){
- *bg++ = *(line+1);
+ *bg++ = *(line+1);
line+=2; continue;
}
if(*line == '\\' && *(line+1) == 'n'){
- *bg++ = '\n';
+ *bg++ = '\n';
line+=2; continue;
}
if(*line == '\\' && *(line+1) == 'r'){
- *bg++ = '\r';
+ *bg++ = '\r';
line+=2; continue;
}
if(*line == '\\' && (*(line+1) == '\n' || *(line+1) == '\r')){ //multiline
continue;
}
*bg++ = *line++;
- }
+ }
if(quoted && !multiline){
error(curLine, fileName, "unterminated quote");
tagNode->pushValue(nodeValue);
}
}
-
+
return 0;
}
int DOTCONFDocument::parseFile(DOTCONFDocumentNode * _parent)
if(ret == -1){
break;
}
- }
+ }
}
}
}
int DOTCONFDocument::setContent(const char * _fileName)
-{
+{
int ret = 0;
char realpathBuf[PATH_MAX];
}
ret = parseFile();
-
+
(void) fclose(file);
if(!ret){
-
+
if( (ret = checkConfig(nodeTree.begin())) == -1){
return -1;
}
//free(fileName);
fileName = strdup(realpathBuf);
from = nodeTree.end(); --from;
-
+
if(tagNode->parentNode){
DOTCONFDocumentNode * nd = tagNode->parentNode->childNode;
while(nd){
curPrev = nd;
}
ret = parseFile(tagNode->parentNode);
-
+
//ret = parseFile(tagNode->parentNode);
(void) fclose(file);
if(ret == -1)
{
for(std::list<char*>::const_iterator ci = requiredOptions.begin(); ci != requiredOptions.end(); ++ci){
bool matched = false;
- for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i!=nodeTree.end(); ++i){
+ for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i!=nodeTree.end(); ++i){
if(!cmp_func((*i)->name, *ci)){
matched = true;
break;
buf = mempool->strdup(subs);
} else {
std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin();
- for(; i!=nodeTree.end(); ++i){
+ for(; i!=nodeTree.end(); ++i){
DOTCONFDocumentNode * tagNode = *i;
if(!cmp_func(tagNode->name, variable)){
if(tagNode->valuesCount != 0){
const DOTCONFDocumentNode * DOTCONFDocument::findNode(const char * nodeName, const DOTCONFDocumentNode * parentNode, const DOTCONFDocumentNode * startNode) const
{
//printf("nodeName=%s, cont=%s, start=%s\n", nodeName, containingNode!=NULL?containingNode->name:"NULL", startNode!=NULL?startNode->name:"NULL");
-
+
std::list<DOTCONFDocumentNode*>::const_iterator i = nodeTree.begin();
if(startNode == NULL)