Exemplo n.º 1
0
/* args:
   - managed_svc - pointer to svc table
   - is_in_ipvs  - function stores status is a virtual defined in ipvs 
                   (status is saved here only if (is_in_ipvs != NULL)
*/
int ipvsfuncs_del_unmanaged_services(ipvs_service_t **managed_svc, gint *is_in_ipvs) {
	int i, idx, found;

	ipvs_service_t **m;
	struct ip_vs_service_entry *se;
	struct ip_vs_get_services *vs;

    ipvsfuncs_reinitialize(); //if someone clears IPVS ipvs_get_services returns vs table which contains crap inside
    vs = ipvs_get_services();
    if (!vs) 
        return -1;

    LOGDETAIL("vs = %x, vs->num_services = %d", vs, vs->num_services);

	for (i = 0; i < vs->num_services; i++) {
		se = &vs->entrytable[i];
        LOGDETAIL("del_umanaged_services check: [%d], ip=%x, port=%d, protocol=%d, fwmark=%d", 
				i, ntohl(se->addr.ip), ntohs(se->port), se->protocol, se->fwmark);
		m = managed_svc;
		found = 0;
		idx = 0;
		while (*m) {
            LOGDETAIL(" * compare to [%x:%d proto=%d fwmark=%d]",
                      ntohl((*m)->addr.ip), ntohs((*m)->port), 
                      (*m)->protocol, (*m)->fwmark);
			if ((*m)->addr.ip == se->addr.ip && 
				(*m)->port == se->port &&
				(*m)->protocol == se->protocol &&
				(*m)->fwmark == se->fwmark) {
				found = 1;
				if (is_in_ipvs)
					is_in_ipvs[idx] = 1;
				break;
			}
			m++;
			idx++;
		}

		if (!found) {
            LOGDEBUG("Delete unmanaged virtual: ip=%s, port=%d, protocol=%d, fwmark=%d", 
                      INETTXTADDR(se->addr.ip), ntohs(se->port), se->protocol, se->fwmark);
			ipvsfuncs_del_service_entry((struct ip_vs_service_entry *)se);
        }
	}
	free(vs);

//    ipvsfuncs_fprintf_ipvs(stderr);

	return 0;
}
Exemplo n.º 2
0
void lock_ipvssync() {
    LOGDETAIL("lock_ipvssync");
    if (lockfd < 0)
        lockfd = open(G_lock_sync_file, 0, S_IRWXU | S_IRGRP | S_IROTH);

    if (lockfd < 0) {
        fprintf(stderr, "Can't open lockfile: %s [error=%s]\n", 
		G_lock_sync_file, STRERROR);
        exit(1);
    }
    flock(lockfd, LOCK_EX);            
}
Exemplo n.º 3
0
int CLoginHandler::LoginRole(const RoleID& stRoleID, TNetHead_V2* pNetHead, const Zone_LoginServer_Request& rstRequest)
{
    ASSERT_AND_LOG_RTN_INT(pNetHead);

	int iSessionID = (int)ntohl(pNetHead->m_uiSocketFD);

	LOGDETAIL("Login Req: Uin = %u, Session = %d\n", stRoleID.uin(), iSessionID);

	// 该Session已经存在
	CSessionManager* pSessionManager = CModuleHelper::GetSessionManager();
	CGameSessionObj* pSessionObj = pSessionManager->FindSessionByID(iSessionID);
	if (pSessionObj)
	{
		LOGERROR("Session Already Exist: ID = %d\n", iSessionID);
		return -2;
	}

	// 该RoleID的Session已经存在,且处于未登录状态
	pSessionObj = pSessionManager->FindSessionByRoleID(stRoleID);
	if (pSessionObj && pSessionObj->GetBindingRole() == NULL)
	{
		LOGERROR("Session Alreay Binding Role: ID = %d, Uin = %u\n", iSessionID, stRoleID.uin());
		return -3;
	}

    // 创建一个新的会话
    pSessionObj = pSessionManager->CreateSession(pNetHead, stRoleID);
    if(!pSessionObj)
    {
        LOGERROR("Cannot Create Session: Uin = %u, SessionID = %d\n", stRoleID.uin(), iSessionID);  
        return -2;
    }

    // 保存客户端版本号
    pSessionObj->SetClientVersion(rstRequest.uclientversion());

	//保存登录原因
	pSessionObj->SetLoginReason(rstRequest.uloginreason());

    // 向World发送踢人请求,相同uin的都踢下去
    int iRet = KickRoleFromWorldServer(stRoleID, iSessionID);
    if (iRet < 0)
    {
        CModuleHelper::GetSessionManager()->DeleteSession(iSessionID);
    }

    return iRet;
}
Exemplo n.º 4
0
/* ---------------------------------------------------------------------- */
gint diffs_clean_old_files(Config *conf) { 
    GDir          *dir;
    const gchar   *de;
    gchar         *diffname;
    gchar         *ffname;
    gint           matched = 0;
    struct timeval ctime;

    gettimeofday(&ctime, NULL);
    if (ctime.tv_sec - conf->last_diffs_cleanup.tv_sec < DIFFS_CLEANUP_SEC) {
        LOGDETAIL("Cleanup time not reached curr[%d], last[%d], diff[%d]",
                  ctime.tv_sec, conf->last_diffs_cleanup.tv_sec,
                  ctime.tv_sec - conf->last_diffs_cleanup.tv_sec);
        return 0;
    }
        
    dir = g_dir_open(G_diff_sync_dir, 0, NULL);
    if (!dir) {
        G_logfd = STDERR_FILENO;
        LOGERROR("Can't open directory: %s", G_diff_sync_dir);
        exit(1);
    }

    diffname = g_path_get_basename(conf->diff_filename);

    while ((de = g_dir_read_name(dir))) {
        if (strcmp(de, diffname) >= 0)
            continue;
        LOGINFO("diff file [%s] < current diff [%s], removing", de, diffname);

        ffname = g_build_filename(G_diff_sync_dir, de, NULL);
        if (unlink(ffname))
            LOGERROR("Problem removing diff [%s]", ffname);
        else 
            matched++;
        g_free(ffname);
    };

    g_free(diffname);
    g_dir_close(dir);
    conf->last_diffs_cleanup = ctime;

    LOGINFO("diffs cleanup, matched %d files", matched);

    return matched;
}
Exemplo n.º 5
0
/* ---------------------------------------------------------------------- */
gint sd_cmd_listen_socket_create(gchar *addr, u_int16_t lport) {
    struct sockaddr_in  sa;
    SDClient            *server = NULL;
    gchar               *localhost = "127.0.0.1";
    int                 reuseaddr = 1;

    LOGDETAIL("%s()", __PRETTY_FUNCTION__);

    listen_sock = sd_socket_nb(SOCK_STREAM);

    if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, 
                   (const void *) &reuseaddr, sizeof(int)) == -1) {
        LOGERROR("Unable to reuse listen_sock [%s]", STRERROR);
    }

    if (!strlen(addr))
        addr = localhost;

    sa.sin_family = PF_INET;
    sa.sin_port = htons(lport);
    sa.sin_addr.s_addr = inet_addr(addr);

    LOGINFO("Binding cmd interface to [%s:%d]", addr, lport);
    if (bind(listen_sock, (struct sockaddr *)&sa, sizeof(sa))) {
        LOGERROR("Unable to bind to socket: [%s:%d] [syserror = %s]", addr, lport, STRERROR);
        exit(1);
    }

    if (listen(listen_sock, MAX_CLIENTS)) {
        LOGERROR("Unable to listen()");
        return -1;
    }
    server = (SDClient *) malloc(sizeof(SDClient));
    server->fd = listen_sock;

    if (!cmd_epoll)
        cmd_epoll = sd_epoll_new(MAX_CLIENTS+1);

    sd_epoll_ctl(cmd_epoll, EPOLL_CTL_ADD, listen_sock, server, EPOLLIN);

    return listen_sock;
}
Exemplo n.º 6
0
/* Split line into hash table, returns GHashTable */
GHashTable *sd_parse_line(gchar *line) {
    GHashTable *ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
    g_assert(ht);

    gchar **strv = g_strsplit_set(line, " \t", 0);
    gchar **v;
	
    v = strv;
    while ( *v ) {
        gchar **kvstrv = g_strsplit_set(*v, "=", 0);
        if (kvstrv[0] && kvstrv[1]) {
            LOGDETAIL("* key = %s, val = %s", kvstrv[0], kvstrv[1]);
            g_hash_table_insert(ht, g_strdup(kvstrv[0]), g_strdup(kvstrv[1]));
        }
        g_strfreev(kvstrv);
        v++;
    }

    g_strfreev(strv);

    return ht;
}
Exemplo n.º 7
0
/* ---------------------------------------------------------------------- */
gboolean ipvsfuncs_set_svc_from_ht(ipvs_service_t *svc, GHashTable *ht) {
    gchar       *vproto, *vaddr, *vport, *vsched, *vpers, *vops, *v;
    u_int16_t    svcproto   = IPPROTO_TCP;
    guint        vfwmark    = 0;
    __be32       netmask    = ~0;
    unsigned     timeout    = 0;
    unsigned     flags      = 0;

    /* svcproto */
    vproto = g_hash_table_lookup(ht, "vproto");
    LOGDETAIL("vproto = [%s]", vproto);
    if (!vproto) {
        LOGERROR("No vproto set");
        return FALSE;
    }

    if (strcmp(vproto, "tcp") && 
        strcmp(vproto, "udp") && 
        strcmp(vproto, "fwmark")) {
        LOGERROR("Unknown protocol [%s]", vproto);
        return FALSE;
    }

    if (!strcmp(vproto, "udp"))
        svcproto = IPPROTO_UDP;
    else if (!strcmp(vproto, "fwmark")) {
        vfwmark = 300;
        v = g_hash_table_lookup(ht, "vfwmark");
        if (v) 
            vfwmark = atoi(v);
    }

    vaddr = g_hash_table_lookup(ht, "vaddr");
    if (!vaddr) {
        LOGERROR("No vaddr set");
        return FALSE;
    }
    
    vport = g_hash_table_lookup(ht, "vport");
    if (!vport) {
        LOGERROR("No vport set");
        return FALSE;
    }

    /* vsched */
    vsched = g_hash_table_lookup(ht, "vsched");
    if (!vsched) {
        LOGERROR("No vsched set");
        return FALSE;
    }

    /* Get persistent timeout if defined */
    vpers = g_hash_table_lookup(ht, "vpers");
    if (vpers) {
        flags |= IP_VS_SVC_F_PERSISTENT;
        timeout = atoi(vpers);
    }

    /* Get "one packet scheduler" if defined */
    vops = g_hash_table_lookup(ht, "vops");
    if (vops) {
        flags |= IP_VS_SVC_F_ONEPACKET;
    }

    ipvsfuncs_set_svc(svcproto, vaddr, vport, vfwmark, vsched, flags, timeout, netmask, svc);
    
    return TRUE;
}
Exemplo n.º 8
0
static CfgVirtual *sd_cmd_find_virt(GPtrArray *VCfgArr, GHashTable *ht, gchar *errbuf) {
    CfgVirtual    *virt = NULL;
    gchar         *vaddr, *vport, *vproto, *vfwmark;
    gint           i;
    gboolean       found = FALSE;
    in_addr_t      addr;
    u_int16_t      port;
    SDIPVSProtocol proto;
    u_int32_t      fwmark;
    gchar         *defaddr = "0.0.0.0";
    gchar         *deffwmark = "0";
    
    vaddr = g_hash_table_lookup(ht, "vaddr");
    if (!vaddr)
        vaddr = defaddr;

    vport = g_hash_table_lookup(ht, "vport");
    if (!vport)
        vport = deffwmark;

    vproto = g_hash_table_lookup(ht, "vproto");
    if (!vproto) {
        if (errbuf)
            strcpy(errbuf, "cmd_find_virt: No vproto specified\n");
        return NULL;
    }

    vfwmark = g_hash_table_lookup(ht, "vfwmark");
    if (!vfwmark) {
        vfwmark = deffwmark;
    }

    addr   = inet_addr(vaddr);
    port   = htons(atoi(vport));
    proto  = sd_proto_no(vproto);
    fwmark = atoi(vfwmark);

    if (addr == -1) {
        LOGINFO("[^] logic: find_virt() invalid IP");
        return NULL;
    }

    for (i = 0; i < VCfgArr->len; i++) {
        virt = (CfgVirtual *) g_ptr_array_index(VCfgArr, i);
        LOGDETAIL("addr = %x==%x, %d==%d, %d==%d, %d==%d", virt->addr, addr, virt->port, port, 
                  virt->ipvs_proto, proto, virt->ipvs_fwmark, fwmark);
        if (fwmark > 0 && virt->ipvs_fwmark > 0 && !(virt->ipvs_fwmark - fwmark)) {
            found = TRUE;
            break;
        }
        
        if (!virt->ipvs_fwmark && 
            virt->addr == addr && virt->port == port &&
            virt->ipvs_proto == proto) {
            found = TRUE;
            break;
        }
    }

    if (!found) {
        if (errbuf)
            strcpy(errbuf, "cmd_find_virt: Virt not found\n");
        return NULL;
    }

    return virt;
}
Exemplo n.º 9
0
void unlock_ipvssync() {
    LOGDETAIL("unlock_ipvssync");
    flock(lockfd, LOCK_UN);
}