+2

IIS.Dashboard - Quản lý IIS bằng trình duyệt tại sao không?

Chào các bạn. Hôm nay mình sẽ thảo luận với các bạn về 1 chủ đề mới: Quản lý IIS bằng trình duyệt.

1. Bài toán đặt ra

Trong 1 công ty có nhiều team cùng phát triển và dùng chung 1 con window server để deploy các trang nội bộ lên 1 IIS chung. Bộ phận IT sẽ giới hạn số người truy cập vào cùng 1 lúc . Vấn đề đặt ra là có rất nhiều service với nhiều team khác nhau nên tại một thời điểm có thể có rất nhiều người muốn truy cập vào để deploy, restart, chỉnh cấu hình....

2. Ý tưởng

Ý tưởng của mình là xây 1 con website có thể thao tác với IIS ở server. Khi đó người dùng chỉ cần đăng nhập vào nó dựa trên quyền được cấp để thao tác với IIS.

3. Giải pháp

Mình sẽ dựng 1 con web sử dụng asp.net core razor page. Để thao tác với IIS mình sẽ sử dụng thư viện Microsoft.Web.Administration. Database là sqlite vì chỉ cần 1 file nhỏ đơn giản.

4. Bắt đầu code thôi

4.1. Quản lý website

Tạo 1 class website để hiển thị thông tin các website có trên IIS


 public class Website
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string State { get; set; }
        public int Port { get; set; }
    }
    

Lấy tất cả website:

 public void GetAllSites()
        {
            using (ServerManager server = new ServerManager())
            {
                this.Websites = new List<Website>();
                foreach (var item in server.Sites)
                {
                    var web = new Website()
                    {
                        Name = item.Name,
                        State = item.State.ToString(),
                        Id = item.Id
                    };
                    
                    foreach (var b in item.Bindings)
                    {
                        web.Port =b.EndPoint.Port;
                        break;
                    }
                    this.Websites.Add(web);

                }
            }
        }

Start /Stop website:

 public void OnPostStart(long site)
        {
            using (ServerManager server = new ServerManager())
            {
                foreach (var item in server.Sites)
                {

                   if(item.Id == site && (item.State == ObjectState.Stopped || item.State == ObjectState.Stopping))
                    {
                        item.Start();
                        break;
                    }

                }
            }
            this.GetAllSites();
        }
        public void OnPostStop(long site)
        {
            using (ServerManager server = new ServerManager())
            {
                foreach (var item in server.Sites)
                {

                    if (item.Id == site && (item.State == ObjectState.Started || item.State == ObjectState.Starting))
                    {
                        item.Stop();
                        break;
                    }

                }
            }
            this.GetAllSites();
        }
        

Các thao tác khác mình chưa làm đến các bạn có thể chờ mình cập nhật vào github phía dưới. image.png

4.2. Quản lý pool

Lấy tất cả các pool:

public class AppPool
    {
        public string Name { get; set; }
        public string State { get; set; }
    }
    
 public void GetAllPools()
        {
            using (ServerManager server = new ServerManager())
            {
               this.AppPools = new List<AppPool>();
                foreach (var item in server.ApplicationPools)
                {
                    this.AppPools.Add(new AppPool()
                    {
                        Name = item.Name,
                         State =item.State.ToString()
                    });
                
                }
            }
        }

Start/ Stop pool:

public void OnPostStop(string pool)
    {
        using (ServerManager server = new ServerManager())
        {
            foreach (var item in server.ApplicationPools)
            {
                if(item.Name == pool)
                {
                    item.Stop();
                }

            }
        }
        this.GetAllPools();
    }
    public void OnPostStart(string pool)
    {
        using (ServerManager server = new ServerManager())
        {
            foreach (var item in server.ApplicationPools)
            {
                if (item.Name == pool)
                {
                    item.Start();
                }

            }
        }
        this.GetAllPools();
    }

Các thao tác khác mình chưa làm đến các bạn có thể chờ mình cập nhật vào github phía dưới. image.png

4.3. Các phần khác

Ngoài ra còn các phần mình dự kiến sẽ có trong dự án này như login, phân quyền user .... Các bạn có thể theo dõi tiến độ của nó tại github của mình iis.dashboard


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí