diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..132821e
--- /dev/null
+++ b/.gitignore
@@ -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
+
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..79a4365
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..b95155a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/ops_interface.iml b/.idea/ops_interface.iml
new file mode 100644
index 0000000..6f63a63
--- /dev/null
+++ b/.idea/ops_interface.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/__pycache__/__init__.cpython-37.pyc b/config/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..240ca3b
Binary files /dev/null and b/config/__pycache__/__init__.cpython-37.pyc differ
diff --git a/config/__pycache__/config.cpython-37.pyc b/config/__pycache__/config.cpython-37.pyc
new file mode 100644
index 0000000..1342fa3
Binary files /dev/null and b/config/__pycache__/config.cpython-37.pyc differ
diff --git a/data_channel/__pycache__/__init__.cpython-37.pyc b/data_channel/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..19d0968
Binary files /dev/null and b/data_channel/__pycache__/__init__.cpython-37.pyc differ
diff --git a/data_channel/__pycache__/gamelog_external.cpython-37.pyc b/data_channel/__pycache__/gamelog_external.cpython-37.pyc
new file mode 100644
index 0000000..c0140c3
Binary files /dev/null and b/data_channel/__pycache__/gamelog_external.cpython-37.pyc differ
diff --git a/data_channel/__pycache__/mp2shushu.cpython-37.pyc b/data_channel/__pycache__/mp2shushu.cpython-37.pyc
new file mode 100644
index 0000000..5cecb14
Binary files /dev/null and b/data_channel/__pycache__/mp2shushu.cpython-37.pyc differ
diff --git a/data_channel/gamelog_external.py b/data_channel/gamelog_external.py
index 0c7f196..dcc55b6 100644
--- a/data_channel/gamelog_external.py
+++ b/data_channel/gamelog_external.py
@@ -2,8 +2,8 @@
#被mp系统调用,用于同步(第三方传递日志需要)appkey到gamelog的相应配置文件
import requests
import logging
-from ops.mansible import AnsibleAPI
-from ops.mmysql import MysqlBase
+from myops.mansible import AnsibleAPI
+from myops.mmysql import MysqlBase
import time
from config.config import args
log = logging.getLogger(__name__)
diff --git a/data_channel/mp2shushu.py b/data_channel/mp2shushu.py
index 3db6818..f72583b 100644
--- a/data_channel/mp2shushu.py
+++ b/data_channel/mp2shushu.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import requests
import logging
-#from ops.ss_virtual_create import SS_Virtual_command
+
import json
log = logging.getLogger(__name__)
import pdb
@@ -103,7 +103,7 @@ class SS_Virtual_command:
class Mp2shushu():
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.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):
r = requests.get(self.mp_url)
diff --git a/data_channel/produce_ss_csv.py b/data_channel/produce_ss_csv.py
new file mode 100644
index 0000000..203542e
--- /dev/null
+++ b/data_channel/produce_ss_csv.py
@@ -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()
diff --git a/ops/ss_virtual_create.py b/data_channel/ss_virtual_create.py
similarity index 94%
rename from ops/ss_virtual_create.py
rename to data_channel/ss_virtual_create.py
index 6311ea4..1c43f9d 100644
--- a/ops/ss_virtual_create.py
+++ b/data_channel/ss_virtual_create.py
@@ -34,7 +34,7 @@ class SS_Virtual_command:
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)
createParam = {"commonHeader": {"projectId": 19},
"mainColumn": {"property": {"columnName": "gameid", "tableType": 0}},
@@ -54,7 +54,7 @@ class SS_Virtual_command:
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)
createParam = {"commonHeader": {"projectId": 22},
"mainColumn": {"property": {"columnName": "#vp@b_n", "tableType": 0, "subTableType": "vprop_sql"}},
@@ -73,7 +73,7 @@ class SS_Virtual_command:
return False
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)
createParam = {"commonHeader": {"projectId": 19},
"mainColumn": {"property": {"columnName": "#vp@button_name", "tableType": 0, "subTableType": "vprop_sql"}},
diff --git a/ops/__init__.py b/deploy/__init__.py
similarity index 100%
rename from ops/__init__.py
rename to deploy/__init__.py
diff --git a/deploy/deploy_keys.py b/deploy/deploy_keys.py
new file mode 100644
index 0000000..4713d07
--- /dev/null
+++ b/deploy/deploy_keys.py
@@ -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()
diff --git a/deploy/deploy_keys.yml b/deploy/deploy_keys.yml
new file mode 100644
index 0000000..faa7463
--- /dev/null
+++ b/deploy/deploy_keys.yml
@@ -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 }} "
\ No newline at end of file
diff --git a/mp2ss.sh b/mp2ss.sh
new file mode 100644
index 0000000..dfd9dae
--- /dev/null
+++ b/mp2ss.sh
@@ -0,0 +1 @@
+curl "http://10.10.3.16:6500/webapp/index.php?c=Ops&a=mp2ss"
diff --git a/myops/__init__.py b/myops/__init__.py
new file mode 100644
index 0000000..7c68785
--- /dev/null
+++ b/myops/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
\ No newline at end of file
diff --git a/ops/csv/1004_button_name.csv b/myops/csv/1004_button_name.csv
similarity index 100%
rename from ops/csv/1004_button_name.csv
rename to myops/csv/1004_button_name.csv
diff --git a/ops/csv/2001_b_n.csv b/myops/csv/2001_b_n.csv
similarity index 100%
rename from ops/csv/2001_b_n.csv
rename to myops/csv/2001_b_n.csv
diff --git a/ops/csv/2001_b_n.csv.old b/myops/csv/2001_b_n.csv.old
similarity index 100%
rename from ops/csv/2001_b_n.csv.old
rename to myops/csv/2001_b_n.csv.old
diff --git a/ops/csv/gameid.csv b/myops/csv/gameid.csv
similarity index 100%
rename from ops/csv/gameid.csv
rename to myops/csv/gameid.csv
diff --git a/ops/mansible.py b/myops/mansible.py
similarity index 100%
rename from ops/mansible.py
rename to myops/mansible.py
diff --git a/ops/mmysql.py b/myops/mmysql.py
similarity index 100%
rename from ops/mmysql.py
rename to myops/mmysql.py
diff --git a/ops/mylog.py b/myops/mylog.py
similarity index 100%
rename from ops/mylog.py
rename to myops/mylog.py
diff --git a/myops/ss_virtual_create.py b/myops/ss_virtual_create.py
new file mode 100644
index 0000000..1c43f9d
--- /dev/null
+++ b/myops/ss_virtual_create.py
@@ -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()
diff --git a/ops/__pycache__/__init__.cpython-37.pyc b/ops/__pycache__/__init__.cpython-37.pyc
deleted file mode 100644
index 90290c1..0000000
Binary files a/ops/__pycache__/__init__.cpython-37.pyc and /dev/null differ
diff --git a/ops/__pycache__/mansible.cpython-37.pyc b/ops/__pycache__/mansible.cpython-37.pyc
deleted file mode 100644
index cb5cf99..0000000
Binary files a/ops/__pycache__/mansible.cpython-37.pyc and /dev/null differ
diff --git a/ops/__pycache__/mmysql.cpython-37.pyc b/ops/__pycache__/mmysql.cpython-37.pyc
deleted file mode 100644
index cb3f66a..0000000
Binary files a/ops/__pycache__/mmysql.cpython-37.pyc and /dev/null differ
diff --git a/ops/__pycache__/mylog.cpython-37.pyc b/ops/__pycache__/mylog.cpython-37.pyc
deleted file mode 100644
index e0f0c58..0000000
Binary files a/ops/__pycache__/mylog.cpython-37.pyc and /dev/null differ
diff --git a/ops/__pycache__/ss_virtual_create.cpython-37.pyc b/ops/__pycache__/ss_virtual_create.cpython-37.pyc
deleted file mode 100644
index 67b2f4e..0000000
Binary files a/ops/__pycache__/ss_virtual_create.cpython-37.pyc and /dev/null differ
diff --git a/web.py b/web.py
index 0cf0f87..54a4635 100644
--- a/web.py
+++ b/web.py
@@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
-# ops 通用接口
+# myops 通用接口
# python web.py --port=6013
import tornado.ioloop
import tornado.web
import tornado.options
from tornado import gen
-from ops.mylog import define_logger
+from myops.mylog import define_logger
import logging
from config.config import *
import pdb
from data_channel.gamelog_external import Build_Gamelog_Config
from data_channel.mp2shushu import Mp2shushu
-
-define_logger("/data/logs/ops/ops_interface.log")
+from deploy.deploy_keys import DeployKeys
+define_logger("/data/logs/myops/ops_interface.log")
log = logging.getLogger(__name__)
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()
elif self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'mp2ss':
yield self._selfmp2ss()
+ elif self.get_query_argument('c') == 'Deploy' and self.get_query_argument('a') == 'keys':
+ yield self._selfdeploykeys()
else:
self.write("pls check args!")
- @gen.coroutine
- def post(self):
- if self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'upJumpRecording':
- self._selfupJumpRecording()
+ # @gen.coroutine
+ # def post(self):
+ # if self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'upJumpRecording':
+ # 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):
try: