This commit is contained in:
pengtao 2020-01-10 22:37:30 +08:00
commit 974c3c394e
33 changed files with 383 additions and 15 deletions

23
.gitignore vendored Normal file
View File

@ -0,0 +1,23 @@
*.pyc
*.log
*.old
.idea/
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
.pem
test_*
*.pid
*.log.*
.DS_Store
.vscode/settings.json
.gitignore
.DS_Store
*.txt
*.csv

4
.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

7
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (venv)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ops_interface.iml" filepath="$PROJECT_DIR$/.idea/ops_interface.iml" />
</modules>
</component>
</project>

12
.idea/ops_interface.iml generated Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="Nosetests" />
<option name="PROJECT_TEST_RUNNER" value="Nosetests" />
</component>
</module>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,8 +2,8 @@
#被mp系统调用用于同步(第三方传递日志需要)appkey到gamelog的相应配置文件 #被mp系统调用用于同步(第三方传递日志需要)appkey到gamelog的相应配置文件
import requests import requests
import logging import logging
from ops.mansible import AnsibleAPI from myops.mansible import AnsibleAPI
from ops.mmysql import MysqlBase from myops.mmysql import MysqlBase
import time import time
from config.config import args from config.config import args
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import requests import requests
import logging import logging
#from ops.ss_virtual_create import SS_Virtual_command
import json import json
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
import pdb import pdb
@ -103,7 +103,7 @@ class SS_Virtual_command:
class Mp2shushu(): class Mp2shushu():
def __init__(self, gameid, channel): def __init__(self, gameid, channel):
self.mp_url = f"http://10.10.5.4:2333/api/open/promotion/co-list?channelid={channel}&gameid={gameid}" self.mp_url = f"http://10.10.5.4:2333/api/open/promotion/co-list?channelid={channel}&gameid={gameid}"
self.filename = "/data/git/ops_interface/ops/csv/2001_b_n.csv" self.filename = "/data/git/ops_interface/myops/csv/2001_b_n.csv"
def get_ad_list(self): def get_ad_list(self):
r = requests.get(self.mp_url) r = requests.get(self.mp_url)

View File

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
import pdb
import requests
def get_mp_interface(gameid, channelid):
base_url = "http://10.10.5.4:2333/api/open/cfg/all?"
key = "name-table"
url = f"{base_url}channelid={channelid}&gameid={gameid}&key={key}"
r = requests.get(url)
if r.status_code == requests.codes.ok:
return r.json().get('result')
else:
return None
class ProduceSSCsv:
def __init__(self):
# self.base_path = "/data/git/ops_interface/myops/csv"
self.base_path = "/tmp"
self.gameid_list = [1004, 1001, 2001, 1011,2002]
self.channelid = 6001
def write2csv(self, data):
filename = f"{self.base_path}/all__button_name.csv"
with open(filename, 'w') as f:
f.write("button_name,button_name_cn\n")
print(data)
for key, values in data.items():
f.write(f"{key},{values}\n")
def run(self):
all = dict()
for gameid in self.gameid_list:
data = get_mp_interface(gameid, self.channelid)
all.update(data)
self.write2csv(all)
if __name__ == "__main__":
pp = ProduceSSCsv()
pp.run()

View File

@ -34,7 +34,7 @@ class SS_Virtual_command:
def upload_gameid(self): def upload_gameid(self):
filename = "/data/git/ops_interface/ops/csv/gameid.csv" filename = "/data/git/ops_interface/myops/csv/gameid.csv"
projectId = int(19) projectId = int(19)
createParam = {"commonHeader": {"projectId": 19}, createParam = {"commonHeader": {"projectId": 19},
"mainColumn": {"property": {"columnName": "gameid", "tableType": 0}}, "mainColumn": {"property": {"columnName": "gameid", "tableType": 0}},
@ -54,7 +54,7 @@ class SS_Virtual_command:
def upload_2001_b_n(self): def upload_2001_b_n(self):
filename = "/data/git/ops_interface/ops/csv/2001_b_n.csv" filename = "/data/git/ops_interface/myops/csv/2001_b_n.csv"
projectId = int(22) projectId = int(22)
createParam = {"commonHeader": {"projectId": 22}, createParam = {"commonHeader": {"projectId": 22},
"mainColumn": {"property": {"columnName": "#vp@b_n", "tableType": 0, "subTableType": "vprop_sql"}}, "mainColumn": {"property": {"columnName": "#vp@b_n", "tableType": 0, "subTableType": "vprop_sql"}},
@ -73,7 +73,7 @@ class SS_Virtual_command:
return False return False
def upload_1004_button_name(self): def upload_1004_button_name(self):
filename = "/data/git/ops_interface/ops/csv/1004_button_name.csv" filename = "/data/git/ops_interface/myops/csv/1004_button_name.csv"
projectId = int(19) projectId = int(19)
createParam = {"commonHeader": {"projectId": 19}, createParam = {"commonHeader": {"projectId": 19},
"mainColumn": {"property": {"columnName": "#vp@button_name", "tableType": 0, "subTableType": "vprop_sql"}}, "mainColumn": {"property": {"columnName": "#vp@button_name", "tableType": 0, "subTableType": "vprop_sql"}},

144
deploy/deploy_keys.py Normal file
View File

@ -0,0 +1,144 @@
# -*- coding: utf-8 -*-
# python3 deploy_keys.py cloud_php
# python3 deploy_keys.py loginserver_php
from ops.mmysql import MysqlBase
from ops.mansible import AnsibleAPI
from ops.mlog import define_logger
from ops.common import run_cmd
import logging
import datetime
import os
import tarfile
import svn
import shutil
import pdb
define_logger("/data/logs/ops/deploy_keys.log")
log = logging.getLogger(__name__)
dbargs = dict()
dbargs['host'] = '10.10.3.5'
dbargs['user'] = 'ops'
dbargs['pswd'] = 'deploy2018'
dbargs['db'] = 'ywplatform'
class DeployKeys:
def __init__(self, project):
self.env='prod'
self.project = project
self.svn_base = f"/data/publish/svn/{self.env}"
self.svn_paths = f"{self.svn_base}/{self.project}"
def run(self):
if not os.path.isdir(self.svn_paths):
self.svn_paths = f"/data/publish/svn/{self.env}/global/{self.project}"
svn_path, ipadr = self.get_config()
if ipadr:
args = dict()
tar_file = self.build_svn_tar()
if tar_file:
hostfile = self.build_hostfile(ipadr)
args['hostfile'] = hostfile
args['tar_file'] = tar_file[0]
if self.ansible_deploy(args):
return True
else:
log.error(f"tar file no found with {self.project}")
return False
else:
raise Exception(f"{self.project} config not found in manager table!")
def get_config(self):
sql = f"""SELECT
config_address,
run_server
FROM
`deploy_projectmanage`
WHERE
project_name="{self.project}"
and env='{self.env}'"""
mydb = MysqlBase(**dbargs)
data = mydb.query(sql)
ip_addr = list()
if data:
for line in data:
try:
svn_path = line[0]
ip_addr.append(line[1])
except Exception:
log.error(f"split {self.project} config failed", exc_info=True)
svn_path = None
return (svn_path, ip_addr)
def build_svn_tar(self):
try:
log.info("svn export config start")
cmd = f"cd {self.svn_paths} && svn cleanup && svn up && tar zcvf keys.tar.gz keys "
status, output = run_cmd(cmd)
if status:
log.info("svn export config success")
else:
raise Exception("update svn failed!")
except Exception:
log.error(f"get remote {self.project} svn failed", exc_info=True)
# project_paths = os.path.join(self.svn_paths, self.project)
# tar = tarfile.open(self.svn_paths + '.tar.gz', 'w:gz')
# os.chdir(self.svn_paths)
# key_dirs = os.path.join(self.svn_paths, "keys")
# for f in os.listdir(key_dirs):
# tar.add(f)
# tar.close()
# 判断是否有生成tar包
list_dir = os.listdir(self.svn_paths)
tar_files = list()
for i in list_dir:
if i.split('.')[-1] == "gz" and os.path.isfile(os.path.join(self.svn_paths, i)):
tar_files.append(os.path.join(self.svn_paths, i))
if len(tar_files) == 1:
log.info("tarfile {0} config to tar.gz success".format(self.project))
return tar_files
else:
return None
def build_hostfile(self, ip_addr):
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
host_files = f"/tmp/host_{now}"
with open(host_files, 'w') as f:
for line in ip_addr:
f.writelines(line + '\n')
return host_files
def ansible_deploy(self, args):
an = AnsibleAPI(args['hostfile'])
tar_files = args['tar_file'].split('/')[-1]
data = {'dest_filename': tar_files, 'source': args['tar_file'], 'project': self.project}
resule = an.run_playbook('deploy_keys.yml', **data)
if not (resule['failed'] or resule['unreachable']):
log.info(f"deploy keys with {self.project} success!")
return True
else:
log.error(f"{self.project} deploy keys failed,{resule}", exc_info=True)
return False
def main():
projects = ['loginserver_php', 'cloud_php']
for project in projects:
dk = DeployKeys(project)
if not dk.run():
msg = f"deploy {project} failed"
log.error(msg, exc_info=True)
raise Exception(msg)
if __name__ == "__main__":
main()

11
deploy/deploy_keys.yml Normal file
View File

@ -0,0 +1,11 @@
- hosts: all
tasks:
- name: rsync deploy file
copy: src={{ source }} dest=/data/apps/{{ project }}/{{ dest_filename }}
- name: back old config file
shell: "rsync -avcp /data/apps/{{ project }}/keys /data/apps/{{ project }}/keys.old"
- name: decomp file
shell: "cd /data/apps/{{ project }} && tar zxvf {{ dest_filename }} "

1
mp2ss.sh Normal file
View File

@ -0,0 +1 @@
curl "http://10.10.3.16:6500/webapp/index.php?c=Ops&a=mp2ss"

1
myops/__init__.py Normal file
View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

103
myops/ss_virtual_create.py Normal file
View File

@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
from urllib.parse import unquote, quote, urlencode
def my_quote(data):
if isinstance(data, dict):
return urlencode(data)
elif isinstance(data, str):
return quote(data)
class SS_Virtual_command:
def __init__(self):
self.ss_virtual_url = "http://10.10.3.14:8993/v1/ta/meta/prop/virtual/dict/create"
self.method = "post"
self.loginName = "root"
self.password = "kingsome2016"
def run_cmd(self, cmd):
import subprocess
msg = "Starting run: %s " % cmd
print("run_cmd {0}".format(msg))
cmdref = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output, error_info = cmdref.communicate()
if cmdref.returncode != 0:
if isinstance(error_info, list) or isinstance(error_info, tuple):
error_info = error_info[0]
msg = "RUN %s ERROR,error info: %s" % (cmd, error_info)
print(f"{msg},error output={output}")
return False
else:
print(f"Run Success,output was {output}")
return True
def upload_gameid(self):
filename = "/data/git/ops_interface/myops/csv/gameid.csv"
projectId = int(19)
createParam = {"commonHeader": {"projectId": 19},
"mainColumn": {"property": {"columnName": "gameid", "tableType": 0}},
"columns": [{"property": {"columnName": "gameid", "columnDesc": "主键ID", "selectType": "string"}},
{"property": {"columnName": "gameid_china", "columnDesc": "游戏名称", "selectType": "string"}}]}
body = {"projectId": projectId, "createParam": createParam, "loginName": self.loginName,
"password": self.password}
quote_body = my_quote(body)
cmd = f"curl --header 'Accept: application/json' --form 'file=@{filename}' '{self.ss_virtual_url}?{quote_body}'"
print(cmd)
if self.run_cmd(cmd):
return True
else:
return False
def upload_2001_b_n(self):
filename = "/data/git/ops_interface/myops/csv/2001_b_n.csv"
projectId = int(22)
createParam = {"commonHeader": {"projectId": 22},
"mainColumn": {"property": {"columnName": "#vp@b_n", "tableType": 0, "subTableType": "vprop_sql"}},
"columns": [{"property": {"columnName": "b_n", "columnDesc": "跳转appid", "selectType": "string"}},
{"property": {"columnName": "b_n_china", "columnDesc": "跳转中文名", "selectType": "string"}}]}
body = {"projectId": projectId, "createParam": createParam, "loginName": self.loginName,
"password": self.password}
quote_body = my_quote(body)
cmd = f"curl --header 'Accept: application/json' --form 'file=@{filename}' '{self.ss_virtual_url}?{quote_body}'"
print(cmd)
if self.run_cmd(cmd):
return True
else:
return False
def upload_1004_button_name(self):
filename = "/data/git/ops_interface/myops/csv/1004_button_name.csv"
projectId = int(19)
createParam = {"commonHeader": {"projectId": 19},
"mainColumn": {"property": {"columnName": "#vp@button_name", "tableType": 0, "subTableType": "vprop_sql"}},
"columns": [{"property": {"columnName": "button_name", "columnDesc": "点击按钮属性", "selectType": "string"}},
{"property": {"columnName": "button_name_cn", "columnDesc": "点击按钮属性(中文)", "selectType": "string"}}]}
body = {"projectId": projectId, "createParam": createParam, "loginName": self.loginName,
"password": self.password}
quote_body = my_quote(body)
cmd = f"curl --header 'Accept: application/json' --form 'file=@{filename}' '{self.ss_virtual_url}?{quote_body}'"
print(cmd)
if self.run_cmd(cmd):
return True
else:
return False
def main():
ss = SS_Virtual_command()
#ss.upload_gameid()
#ss.upload_2001_b_n()
ss.upload_1004_button_name()
if __name__ == "__main__":
main()

Binary file not shown.

27
web.py
View File

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# ops 通用接口 # myops 通用接口
# python web.py --port=6013 # python web.py --port=6013
import tornado.ioloop import tornado.ioloop
import tornado.web import tornado.web
import tornado.options import tornado.options
from tornado import gen from tornado import gen
from ops.mylog import define_logger from myops.mylog import define_logger
import logging import logging
from config.config import * from config.config import *
import pdb import pdb
from data_channel.gamelog_external import Build_Gamelog_Config from data_channel.gamelog_external import Build_Gamelog_Config
from data_channel.mp2shushu import Mp2shushu from data_channel.mp2shushu import Mp2shushu
from deploy.deploy_keys import DeployKeys
define_logger("/data/logs/ops/ops_interface.log") define_logger("/data/logs/myops/ops_interface.log")
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
tornado.options.define("port", default=interface_port, type=int, help="run server on the given port.") tornado.options.define("port", default=interface_port, type=int, help="run server on the given port.")
@ -27,13 +27,24 @@ class DispatchHandler(tornado.web.RequestHandler):
self._selfgamelogexternal() self._selfgamelogexternal()
elif self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'mp2ss': elif self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'mp2ss':
yield self._selfmp2ss() yield self._selfmp2ss()
elif self.get_query_argument('c') == 'Deploy' and self.get_query_argument('a') == 'keys':
yield self._selfdeploykeys()
else: else:
self.write("pls check args!") self.write("pls check args!")
@gen.coroutine # @gen.coroutine
def post(self): # def post(self):
if self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'upJumpRecording': # if self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'upJumpRecording':
self._selfupJumpRecording() # self._selfupJumpRecording()
def _selfdeploykeys(self):
try:
project = self.get_query_argument('project')
dk = DeployKeys(project)
dk.run()
except Exception:
log.error(f"deploy keys with {project} failed", exc_info=True)
def _selfgamelogexternal(self): def _selfgamelogexternal(self):
try: try: