#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import datetime,time
currentGt=4 # max add
dev="eth0" #set dev
devio=0 #0 out / 1 in
key=[<ccessKeyId>,<accessSecret>] #key
ecsformat,autopay,ecsid = ['cn-shenzhen' , 'true' , 'i-wz9c913ulnzfabbtm22d'] #ecsinfo
ecsinfo=ecsformat,autopay,ecsid
ecsidlist=[ecsid]
############################################################## 逻辑部分
def main():
while 1==1:
current,currentuse,Judge=getCurrentUseNetwork(key,ecsformat,ecsidlist)
Oder = 1024
if int(Judge) > 950 and int(Judge) <= 1000:
date=datetime.datetime.now()
start_time=(2019,date.strftime("%m"),date.strftime("%d"),date.strftime("%H"),date.strftime("%M"),00)
start,stop=start_end(start_time, 4)
aliyunpay(key,ecsinfo,start,stop,currentuse + currentGt)
Oder=currentuse + currentGt
time.sleep(250)
elif int(Judge) > 1000 :
date=datetime.datetime.now()
start_time=(2019,date.strftime("%m"),date.strftime("%d"),date.strftime("%H"),date.strftime("%M"),00)
start,stop=start_end(start_time, 4)
aliyunpay(key,ecsinfo,start,stop,current)
print current
Oder=current
else :
print "use :" Judge / 1000 "%"
breaks=0
while 1==1:
if Oder == 1024 :
break
current,currentuse,Judge=getCurrentUseNetwork(key,ecsformat,ecsidlist)
if Oder == currentuse :
Oder = 1024
print Oder,currentuse
break
else:
breaks+=1
print Oder,currentuse
time.sleep(5)
if breaks > 20 :
print Oder,currentuse
exit(0)
############################################################### apiyunpay 提升固定带宽(认证信息,ecs的信息,启动时间,结束时间,提升到多少)
def aliyunpay(key,ecsinfo,startTime,endTime,NetworkMuch):
if len(key) != 2 or len(ecsinfo) != 3 :
print("ERROR: AutoNetWork.aliyunpay([ccessKeyId,accessSecret],[ecsformat,autopay,ecsid,network_much],start,stop)")
exit(0)
ccessKeyId,accessSecret=key
ecsformat,autopay,ecsid=ecsinfo
if autopay == "true" or autopay == "1" or autopay == "yes" or autopay == "ok" :
autopay=1
else :
autopay=0
client = AcsClient(ccessKeyId , accessSecret , ecsformat)
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('ecs.aliyuncs.com')
request.set_method('POST')
request.set_version('2014-05-26')
request.set_action_name('ModifyInstanceNetworkSpec')
request.add_query_param('RegionId', ecsformat)
request.add_query_param('AutoPay', bool(autopay))
request.add_query_param('StartTime',startTime)
request.add_query_param('EndTime', endTime)
request.add_query_param('InstanceId', ecsid)
request.add_query_param('InternetMaxBandwidthOut', NetworkMuch)
response = client.do_action(request)
print(response)
#################################### currentNetwork 获取当前固定带宽(认证信息,服务器所在区编号,服务器列表)
def currentNetwork(key,ecsformat,ecsidlist):
ccessKeyId,accessSecret=key
client = AcsClient(ccessKeyId , accessSecret , ecsformat)
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('ecs.aliyuncs.com')
request.set_method('POST')
request.set_version('2014-05-26')
request.set_action_name('DescribeInstances')
request.add_query_param('RegionId', ecsformat)
request.add_query_param('InstanceIds', ecsidlist)
response = client.do_action(request)
db=json.loads(response)
return (db["Instances"]["Instance"])[0]["InternetMaxBandwidthOut"]
############################################# start_end 修正时间格式获取设置结束时间 参数(启动时间列表[年,月,日,时,分,秒],购买时长) 返回值(启动时间,结束时间)
def start_end(start_time, Ago):
if len(start_time) < 6:
print ("ERROR: aliyunAutoNetWork.py on function(AutoNetWork.start_end()) start_time is 'list' len()=6 ")
print("Parameter type : AutoNetWork.start_end([ year, month , day , hour , Minute ,second ] ,Age)")
print("Example: AutoNetWork.start_end([2018,12,30,23,59,59],Ago])")
exit(0)
else :
year,month,day,hour,Minute,second=start_time
year, month , day , hour , Minute ,second = start_time
defaulttime=datetime.datetime(int(year), int(month) , int(day) , int(hour) , int(Minute) ,int(second), 00 ) - datetime.timedelta(hours=8)
defaulttime=defaulttime+datetime.timedelta(minutes=3)
startTime=defaulttime.strftime("%Y-%m-%dT%H:%MZ")
endTime=(defaulttime + datetime.timedelta(hours=Ago)).strftime("%Y-%m-%dT%HZ")
return startTime,endTime
#################################################get_net_data(传入设备的名称) 是在信息中读取当前的流量值 netInOut(传入要获取设备的名称) 是获取每分钟的值返回(入,出)
def get_net_data(netdev):
with open('/proc/net/dev', 'r') as f:
for line in f:
if line.find(netdev) >= 0:
receive = line.split(':')[1].split()[0]
transmit = line.split(':')[1].split()[8]
return float(receive),float(transmit)
def netInOut(dev):
revc,send=get_net_data(dev)
time.sleep(1)
revcs,sends=get_net_data(dev)
return (((sends - send) / 1024 / 1024 ) * 8 ) , (((revcs - revc) / 1024 / 1024) * 8 )
#########################################################获取当前状态信息 参数=> (阿里云认证[列表]服务器所在区域编号,服务器id[列表]) 返回 (1分钟内平均带宽,当前使用的带宽,带宽使用率百分比)
def getCurrentUseNetwork(key,ecsformat,ecsidlist):
netinfo=netInOut(dev)[devio]
i=1
while i <= 19:
netinfo=netinfo + netInOut(dev)[devio]
i+=1
current=netinfo / 20
currentuse=currentNetwork(key,ecsformat,ecsidlist)
Judge = current / currentuse
return int((current)+ currentGt ),int(currentuse),int(float('%.3f' % Judge) * 1000)
main()