소스 검색

Merge pull request #496 from meolu/2.0/fix/console

2.0/fix/console
huamanshu 6 년 전
부모
커밋
9407447cf8
6개의 변경된 파일568개의 추가작업 그리고 23개의 파일을 삭제
  1. 92 0
      alpha/INSTALL.md
  2. 449 0
      alpha/walle_python_with_data.sql
  3. 4 0
      walle/app.py
  4. 1 1
      walle/model/record.py
  5. 0 3
      walle/service/deployer.py
  6. 22 19
      walle/service/waller.py

+ 92 - 0
alpha/INSTALL.md

@@ -0,0 +1,92 @@
+# Walle 2.0
+Welcome to Walle 2.0. Alpha is a unstable version, please waiting for developer's released tag. If you Have the ability to have try, just try, but I hove no time for truble shooting, fix it by yourself, or submit a issue.
+
+# Developer
+## 给此项目标个星 | Star this repo
+请为我们做开源项目的付出予以肯定和支持,感谢你的信任。
+
+## Clone code
+```
+git clone git@github.com:meolu/walle-web.git
+```
+
+## Nginx config
+Don't forget to restart nginx
+```
+upstream webservers {
+    server dev.admin.walle-web.io:5000 weight=1;
+}
+
+server {
+    listen       80;
+    server_name  api.walle-web.io dev.admin.walle-web.io;
+    access_log   /usr/local/nginx/logs/walle.log main;
+    index index.html index.htm;
+
+    location / {
+        try_files $uri $uri/ /index.html;
+        add_header access-control-allow-origin *;
+        root /Users/wushuiyong/workspace/meolu/walle-fe/dist;
+    }
+
+    location ^~ /api/ {
+        add_header access-control-allow-origin *;
+        proxy_pass      http://webservers;
+        proxy_set_header X-Forwarded-Host $host:$server_port;
+        proxy_set_header  X-Real-IP  $remote_addr;
+        proxy_set_header    Origin        $host:$server_port;
+        proxy_set_header    Referer       $host:$server_port;
+    }
+
+    location ^~ /socket.io/ {
+        add_header access-control-allow-origin *;
+        proxy_pass      http://webservers;
+        proxy_set_header X-Forwarded-Host $host:$server_port;
+        proxy_set_header  X-Real-IP  $remote_addr;
+        proxy_set_header    Origin        $host:$server_port;
+        proxy_set_header    Referer       $host:$server_port;
+        proxy_set_header Host $http_host;
+        proxy_set_header X-NginX-Proxy true;
+
+        # WebScoket Support
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+    }
+}
+```
+
+## Hosts
+```
+vi /etc/hosts
+
+# add one line
+127.0.0.1  dev.admin.walle-web.io
+```
+
+## Data Migration
+```
+mysql -hxx -uxx -p -e'source walle_python_with_data.sql;'
+```
+
+## Config environment
+安装pip。{PROJECT} 默认指项目。 | install pip. {PROJECT} means walle
+```
+pip install virtualenv
+
+cd {PROJECT}
+virtualenv venv
+source venv/bin/activate
+pip install -r requirements/dev.txt
+```
+
+## Config code
+You will know to change what to suit for you environment
+```
+vi walle/config/settings_dev.py
+```
+
+## Start
+```
+sh run.sh  # start with debug mode
+```

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 449 - 0
alpha/walle_python_with_data.sql


+ 4 - 0
walle/app.py

@@ -193,6 +193,10 @@ def register_logging(app):
 
 
 def register_socketio(app):
+    # activate eventlet
+    import eventlet
+    eventlet.monkey_patch()
+
     socketio.init_app(app)
     socketio.on_namespace(WalleSocketIO(namespace='/walle'))
     socketio.run(app, host=app.config.get('HOST'), port=app.config.get('PORT'))

+ 1 - 1
walle/model/record.py

@@ -43,7 +43,7 @@ class RecordModel(Model):
         return ret
 
     def fetch(self, task_id):
-        data = self.query.filter_by(task_id=task_id).order_by('id asc').all()
+        data = self.query.filter_by(task_id=task_id).order_by(RecordModel.id.asc()).all()
         return [p.to_json() for p in data]
 
     @classmethod

+ 0 - 3
walle/service/deployer.py

@@ -48,9 +48,6 @@ class Deployer:
     dir_codebase = '/tmp/walle/codebase/'
     dir_codebase_project = ''
 
-    # 定义远程机器
-    # env.hosts = ['172.16.0.231', '172.16.0.177']
-
     dir_release = None
     dir_webroot = None
 

+ 22 - 19
walle/service/waller.py

@@ -6,10 +6,8 @@
 
 from fabric2 import Connection
 from flask import current_app
+from flask_socketio import emit
 from walle.model.record import RecordModel
-from flask_socketio import SocketIO, emit
-
-
 
 
 class Waller(Connection):
@@ -56,21 +54,23 @@ class Waller(Connection):
                 emit('console', {'event': 'task:console', 'data': ws_dict}, room=wenv['task_id'])
 
             RecordModel().save_record(stage=wenv['stage'], sequence=wenv['sequence'], user_id=wenv['user_id'],
-                                          task_id=wenv['task_id'], status=result.exited, host=self.host, user=self.user,
-                                          command=result.command,success=result.stdout.strip(), error=result.stderr.strip())
+                                      task_id=wenv['task_id'], status=result.exited, host=self.host, user=self.user,
+                                      command=result.command, success=result.stdout.strip(),
+                                      error=result.stderr.strip())
             current_app.logger.info(message)
             return result
 
         except Exception as e:
-            #current_app.logger.exception(e)
-            #return None
+            # current_app.logger.exception(e)
+            # return None
             # TODO 貌似可能的异常有很多种,需要分层才能完美解决 something wrong without e.result
+            error = e.result if 'result' in e else e.message
             RecordModel().save_record(stage=wenv['stage'], sequence=wenv['sequence'], user_id=wenv['user_id'],
-                                          task_id=wenv['task_id'], status=1, host=self.host, user=self.user,
-                                          command=command, success='', error='e.result')
+                                      task_id=wenv['task_id'], status=1, host=self.host, user=self.user,
+                                      command=command, success='', error=error)
             if hasattr(e, 'resean') and hasattr(e, 'result'):
                 message = 'task_id=%s, host:%s command:%s, status=1, reason:%s, result:%s' % (
-                    wenv['task_id'], self.host, command, e.reason, e.result
+                    wenv['task_id'], self.host, command, e.reason, error
                 )
             else:
                 message = 'task_id=%s, host:%s command:%s, status=1, message:%s' % (
@@ -105,26 +105,28 @@ class Waller(Connection):
         return self.sync(wtype='put', local=local, remote=remote, wenv=wenv, *args, **kwargs)
 
     def sync(self, wtype, remote=None, local=None, wenv=None):
+        command = 'put: scp %s %s@%s:%s' % (local, self.user, self.host, remote) if wtype == 'put' \
+            else 'get: scp %s@%s:%s %s' % (self.user, self.host, remote, local)
+
         try:
             if wtype == 'put':
                 result = super(Waller, self).put(local=local, remote=remote)
-                command = 'put: scp %s %s@%s:%s' % (result.local, self.user, self.host, result.remote)
                 current_app.logger.info('put: local %s, remote %s', local, remote)
 
             else:
                 result = super(Waller, self).get(remote=remote, local=local)
-                command = 'get: scp %s@%s:%s %s' % (self.user, self.host, result.remote, result.local)
                 current_app.logger.info('get: local %s, remote %s', local, remote)
                 current_app.logger.info('get: orig_local %s, local %s', result.orig_local, result.local)
 
             current_app.logger.info('put: %s, %s', result, dir(result))
             # TODO 可能会有非22端口的问题
             RecordModel().save_record(stage=wenv['stage'], sequence=wenv['sequence'], user_id=wenv['user_id'],
-                                          task_id=wenv['task_id'], status=0, host=self.host, user=self.user,
-                                          command=command, )
-            message = 'task_id=%d, host:%s command:%s status:0, success:, error:' % (
-            wenv['task_id'], self.host, command)
-            current_app.logger.info(message)
+                                      task_id=wenv['task_id'], status=0, host=self.host, user=self.user,
+                                      command=command, )
+            message = 'task_id=%s, host:%s command:%s status:0, success:, error:' % (
+                wenv['task_id'], self.host, command)
+            current_app.logger.error(self)
+            current_app.logger.error(result)
 
             # TODO
             ws_dict = {
@@ -135,7 +137,7 @@ class Waller(Connection):
                 'stage': wenv['stage'],
                 'sequence': wenv['sequence'],
                 'success': '',
-                'error': result.stderr.strip(),
+                'error': '',
             }
             if wenv['console']:
                 emit('console', {'event': 'task:console', 'data': ws_dict}, room=wenv['task_id'])
@@ -149,7 +151,7 @@ class Waller(Connection):
             ws_dict = {
                 'user': self.user,
                 'host': self.host,
-                'cmd': 'command',
+                'cmd': command,
                 'status': 1,
                 'stage': wenv['stage'],
                 'sequence': wenv['sequence'],
@@ -158,3 +160,4 @@ class Waller(Connection):
             }
             if wenv['console']:
                 emit('console', {'event': 'task:console', 'data': ws_dict}, room=wenv['task_id'])
+